<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/Frog_32px_1177822_easyicon.net.ico">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/Frog_32px_1177822_easyicon.net.ico">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/Frog_16px_1177822_easyicon.net.ico">
  <link rel="mask-icon" href="/images/Frog_32px_1177822_easyicon.net.ico" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">
  <link rel="stylesheet" href="/lib/pace/pace-theme-minimal.min.css">
  <script src="/lib/pace/pace.min.js"></script>

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"hxy1997.xyz","root":"/","scheme":"Pisces","version":"7.8.0","exturl":false,"sidebar":{"position":"left","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":true,"pangu":false,"comments":{"style":"tabs","active":"valine","storage":true,"lazyload":true,"nav":null,"activeClass":"valine"},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"输入关键字","hits_empty":"没有找到与「${query}」相关搜索","hits_stats":"${hits} 条相关记录，共耗时 ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.json"};
  </script>

  <meta name="description" content="Git是目前世界上最先进的分布式版本控制系统，方便我们管理代码的版本，详细的介绍可以参考廖雪峰的Git教程，本文总结常见的Git命令，想要熟悉这些命令，可以通过 Learning Git Branching这个网站，这是一个有趣的教程，在沙盒里执行相应的Git命令，还能看到每个Git命令的执行情况，像玩有些一样通过一系列的关卡，逐步学习 Git 的强大功能。最后增加了一个大大整理的教程，让人觉得g">
<meta property="og:type" content="article">
<meta property="og:title" content="Git 常用命令">
<meta property="og:url" content="https://hxy1997.xyz/2021/04/04/Git%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/index.html">
<meta property="og:site_name" content="hxy的博客">
<meta property="og:description" content="Git是目前世界上最先进的分布式版本控制系统，方便我们管理代码的版本，详细的介绍可以参考廖雪峰的Git教程，本文总结常见的Git命令，想要熟悉这些命令，可以通过 Learning Git Branching这个网站，这是一个有趣的教程，在沙盒里执行相应的Git命令，还能看到每个Git命令的执行情况，像玩有些一样通过一系列的关卡，逐步学习 Git 的强大功能。最后增加了一个大大整理的教程，让人觉得g">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210605174815.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210606172913.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420170433.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420171338.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420171930.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420172100.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420172527.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420172559.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420173100.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420173351.gif">
<meta property="og:image" content="https://uploadfiles.nowcoder.com/images/20200529/933639781_1590755612864_38630241A8024EA006101538D9D640D5">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420173613.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420174612.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420174634.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420214815.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420215516.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420215552.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420215639.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221200.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221736.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221755.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221817.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221836.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221847.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221917.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420222547.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223050.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223106.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223123.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223635.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223823.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223837.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223846.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223914.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224028.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224055.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224112.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224123.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224148.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224203.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224219.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224235.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224244.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224252.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224306.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224318.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224346.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224401.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224409.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224441.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224448.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224455.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224509.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224521.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224602.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224532.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224748.gif">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224801.gif">
<meta property="article:published_time" content="2021-04-04T02:30:00.000Z">
<meta property="article:modified_time" content="2021-06-12T13:14:06.686Z">
<meta property="article:author" content="hxy">
<meta property="article:tag" content="git">
<meta property="article:tag" content="常用命令">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210605174815.png">

<link rel="canonical" href="https://hxy1997.xyz/2021/04/04/Git%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>Git 常用命令 | hxy的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="hxy的博客" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">hxy的博客</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">Mia san Mia!</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a>

  </li>
        <li class="menu-item menu-item-about">

    <a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>
  <div class="reading-progress-bar"></div>

  <a href="https://github.com/huxingyi1997" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://hxy1997.xyz/2021/04/04/Git%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/Robben.gif">
      <meta itemprop="name" content="hxy">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="hxy的博客">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          Git 常用命令
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-04-04 10:30:00" itemprop="dateCreated datePublished" datetime="2021-04-04T10:30:00+08:00">2021-04-04</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2021-06-12 21:14:06" itemprop="dateModified" datetime="2021-06-12T21:14:06+08:00">2021-06-12</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" itemprop="url" rel="index"><span itemprop="name">计算机基础知识</span></a>
                </span>
            </span>

          
            <span class="post-meta-item" title="热度" id="busuanzi_container_page_pv" style="display: none;">
              <span class="post-meta-item-icon">
                <i class="fa fa-eye"></i>
              </span>
              <span class="post-meta-item-text">热度：</span>
              <span id="busuanzi_value_page_pv"></span>
            </span>
  
  <span class="post-meta-item">
    
      <span class="post-meta-item-icon">
        <i class="far fa-comment"></i>
      </span>
      <span class="post-meta-item-text">Valine：</span>
    
    <a title="valine" href="/2021/04/04/Git%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/#valine-comments" itemprop="discussionUrl">
      <span class="post-comments-count valine-comment-count" data-xid="/2021/04/04/Git%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" itemprop="commentCount"></span>
    </a>
  </span>
  
  

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <p>Git是目前世界上最先进的分布式版本控制系统，方便我们管理代码的版本，详细的介绍可以参考<a target="_blank" rel="noopener" href="https://www.liaoxuefeng.com/wiki/896043488029600">廖雪峰的Git教程</a>，本文总结常见的Git命令，想要熟悉这些命令，可以通过 <a target="_blank" rel="noopener" href="https://learngitbranching.js.org/">Learning Git Branching</a>这个网站，这是一个有趣的教程，在沙盒里执行相应的Git命令，还能看到每个Git命令的执行情况，像玩有些一样通过一系列的关卡，逐步学习 Git 的强大功能。最后增加了一个大大整理的教程，让人觉得git如此有趣。</p>
<p>一般来说，日常使用只要记住下图6个命令，就可以了。但是熟练使用，恐怕要记住60～100个命令。</p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210605174815.png" alt="img"></p>
<p>几个专用名词的译名如下。</p>
<blockquote>
<ul>
<li>Workspace：工作区</li>
<li>Index / Stage：暂存区</li>
<li>Repository：仓库区（或本地仓库）</li>
<li>Remote：远程仓库</li>
</ul>
</blockquote>
<span id="more"></span>

<h1 id="Git-常用命令"><a href="#Git-常用命令" class="headerlink" title="Git 常用命令"></a>Git 常用命令</h1><h2 id="1-新建代码库"><a href="#1-新建代码库" class="headerlink" title="1.新建代码库"></a>1.新建代码库</h2><h3 id="在当前目录新建一个Git代码库"><a href="#在当前目录新建一个Git代码库" class="headerlink" title="在当前目录新建一个Git代码库"></a>在当前目录新建一个Git代码库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br></pre></td></tr></table></figure>

<h3 id="新建一个目录，将其初始化为Git代码库"><a href="#新建一个目录，将其初始化为Git代码库" class="headerlink" title="新建一个目录，将其初始化为Git代码库"></a>新建一个目录，将其初始化为Git代码库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init [project-name]</span><br></pre></td></tr></table></figure>

<h3 id="下载一个项目和它的整个代码历史"><a href="#下载一个项目和它的整个代码历史" class="headerlink" title="下载一个项目和它的整个代码历史"></a>下载一个项目和它的整个代码历史</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> [url]</span><br></pre></td></tr></table></figure>



<h2 id="2-配置操作"><a href="#2-配置操作" class="headerlink" title="2.配置操作"></a>2.配置操作</h2><p>Git的设置文件为<code>.git/config</code>，它可以在用户主目录下（全局配置），也可以在项目目录下（项目配置）。</p>
<h3 id="全局配置"><a href="#全局配置" class="headerlink" title="全局配置"></a>全局配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">&#x27;你的名字&#x27;</span></span><br><span class="line">git config --global user.email <span class="string">&#x27;你的邮箱&#x27;</span></span><br></pre></td></tr></table></figure>

<h3 id="当前仓库配置"><a href="#当前仓库配置" class="headerlink" title="当前仓库配置"></a>当前仓库配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --<span class="built_in">local</span> user.name <span class="string">&#x27;你的名字&#x27;</span></span><br><span class="line">git config --<span class="built_in">local</span> user.email <span class="string">&#x27;你的邮箱&#x27;</span></span><br></pre></td></tr></table></figure>

<h3 id="查看-global-配置"><a href="#查看-global-配置" class="headerlink" title="查看 global 配置"></a>查看 global 配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global --list</span><br></pre></td></tr></table></figure>

<h3 id="查看当前仓库配置"><a href="#查看当前仓库配置" class="headerlink" title="查看当前仓库配置"></a>查看当前仓库配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --<span class="built_in">local</span> --list</span><br></pre></td></tr></table></figure>

<h3 id="删除-global-配置"><a href="#删除-global-配置" class="headerlink" title="删除 global 配置"></a>删除 global 配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config -<span class="built_in">unset</span> --global 要删除的配置项</span><br></pre></td></tr></table></figure>

<h3 id="删除当前仓库配置"><a href="#删除当前仓库配置" class="headerlink" title="删除当前仓库配置"></a>删除当前仓库配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --<span class="built_in">unset</span> --<span class="built_in">local</span> 要删除的配置项</span><br></pre></td></tr></table></figure>

<h3 id="编辑Git配置文件"><a href="#编辑Git配置文件" class="headerlink" title="编辑Git配置文件"></a>编辑Git配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config -e [--global]</span><br></pre></td></tr></table></figure>



<h2 id="3-本地操作"><a href="#3-本地操作" class="headerlink" title="3.本地操作"></a>3.本地操作</h2><h3 id="查看变更情况"><a href="#查看变更情况" class="headerlink" title="查看变更情况"></a>查看变更情况</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure>

<h3 id="将当前目录及其子目录下所有变更都加入到暂存区"><a href="#将当前目录及其子目录下所有变更都加入到暂存区" class="headerlink" title="将当前目录及其子目录下所有变更都加入到暂存区"></a>将当前目录及其子目录下所有变更都加入到暂存区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br></pre></td></tr></table></figure>

<h3 id="将仓库内所有变更都加入到暂存区"><a href="#将仓库内所有变更都加入到暂存区" class="headerlink" title="将仓库内所有变更都加入到暂存区"></a>将仓库内所有变更都加入到暂存区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add -A</span><br></pre></td></tr></table></figure>

<h3 id="将指定文件添加到暂存区"><a href="#将指定文件添加到暂存区" class="headerlink" title="将指定文件添加到暂存区"></a>将指定文件添加到暂存区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add 文件1 文件2 文件3</span><br></pre></td></tr></table></figure>

<h3 id="添加每个变化前，都会要求确认"><a href="#添加每个变化前，都会要求确认" class="headerlink" title="添加每个变化前，都会要求确认"></a>添加每个变化前，都会要求确认</h3><p>对于同一个文件的多处变化，可以实现分次提交</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add -p</span><br></pre></td></tr></table></figure>

<h3 id="删除工作区文件，并且将这次删除放入暂存区"><a href="#删除工作区文件，并且将这次删除放入暂存区" class="headerlink" title="删除工作区文件，并且将这次删除放入暂存区"></a>删除工作区文件，并且将这次删除放入暂存区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rm 文件1 文件2 文件3</span><br></pre></td></tr></table></figure>

<h3 id="停止追踪指定文件，但该文件会保留在工作区"><a href="#停止追踪指定文件，但该文件会保留在工作区" class="headerlink" title="停止追踪指定文件，但该文件会保留在工作区"></a>停止追踪指定文件，但该文件会保留在工作区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rm --cache 文件</span><br></pre></td></tr></table></figure>

<h3 id="改名文件，并且将这个改名放入暂存区"><a href="#改名文件，并且将这个改名放入暂存区" class="headerlink" title="改名文件，并且将这个改名放入暂存区"></a>改名文件，并且将这个改名放入暂存区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git mv [file-original] [file-renamed]</span><br></pre></td></tr></table></figure>

<h3 id="比较工作区和暂存区的所有差异"><a href="#比较工作区和暂存区的所有差异" class="headerlink" title="比较工作区和暂存区的所有差异"></a>比较工作区和暂存区的所有差异</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff</span><br></pre></td></tr></table></figure>

<h3 id="比较某文件工作区和暂存区的差异"><a href="#比较某文件工作区和暂存区的差异" class="headerlink" title="比较某文件工作区和暂存区的差异"></a>比较某文件工作区和暂存区的差异</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff 文件</span><br></pre></td></tr></table></figure>

<h3 id="比较暂存区和-HEAD-的所有差异"><a href="#比较暂存区和-HEAD-的所有差异" class="headerlink" title="比较暂存区和 HEAD 的所有差异"></a>比较暂存区和 HEAD 的所有差异</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff --cached</span><br></pre></td></tr></table></figure>

<h3 id="比较某文件暂存区和-HEAD-的差异"><a href="#比较某文件暂存区和-HEAD-的差异" class="headerlink" title="比较某文件暂存区和 HEAD 的差异"></a>比较某文件暂存区和 HEAD 的差异</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff -cached 文件</span><br></pre></td></tr></table></figure>

<h3 id="比较某文件工作区和-HEAD-的差异"><a href="#比较某文件工作区和-HEAD-的差异" class="headerlink" title="比较某文件工作区和 HEAD 的差异"></a>比较某文件工作区和 HEAD 的差异</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff HEAD 文件</span><br></pre></td></tr></table></figure>

<h3 id="创建-commit-提交暂存区到仓库区"><a href="#创建-commit-提交暂存区到仓库区" class="headerlink" title="创建 commit 提交暂存区到仓库区"></a>创建 commit 提交暂存区到仓库区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit</span><br></pre></td></tr></table></figure>

<h3 id="提交并命名"><a href="#提交并命名" class="headerlink" title="提交并命名"></a>提交并命名</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="提交暂存区的指定文件到仓库区"><a href="#提交暂存区的指定文件到仓库区" class="headerlink" title="提交暂存区的指定文件到仓库区"></a>提交暂存区的指定文件到仓库区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit 文件1 文件2 ... -m 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="提交工作区自上次commit之后的变化，直接到仓库区"><a href="#提交工作区自上次commit之后的变化，直接到仓库区" class="headerlink" title="提交工作区自上次commit之后的变化，直接到仓库区"></a>提交工作区自上次commit之后的变化，直接到仓库区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -a</span><br></pre></td></tr></table></figure>

<h3 id="提交时显示所有diff信息"><a href="#提交时显示所有diff信息" class="headerlink" title="提交时显示所有diff信息"></a>提交时显示所有diff信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -v</span><br></pre></td></tr></table></figure>

<h3 id="将工作区指定文件恢复成和暂存区一致"><a href="#将工作区指定文件恢复成和暂存区一致" class="headerlink" title="将工作区指定文件恢复成和暂存区一致"></a>将工作区指定文件恢复成和暂存区一致</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout 文件1 文件2 文件3</span><br></pre></td></tr></table></figure>

<h3 id="将暂存区指定文件恢复成和-HEAD-一致"><a href="#将暂存区指定文件恢复成和-HEAD-一致" class="headerlink" title="将暂存区指定文件恢复成和 HEAD 一致"></a>将暂存区指定文件恢复成和 HEAD 一致</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset 文件1 文件2 文件3</span><br></pre></td></tr></table></figure>

<h3 id="将暂存区和工作区所有文件恢复成和-HEAD-一样"><a href="#将暂存区和工作区所有文件恢复成和-HEAD-一样" class="headerlink" title="将暂存区和工作区所有文件恢复成和 HEAD 一样"></a>将暂存区和工作区所有文件恢复成和 HEAD 一样</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard</span><br></pre></td></tr></table></figure>

<h3 id="用-difftool-比较任意两个-commit-的差异"><a href="#用-difftool-比较任意两个-commit-的差异" class="headerlink" title="用 difftool 比较任意两个 commit 的差异"></a>用 difftool 比较任意两个 commit 的差异</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git difftool 提交1 提交2</span><br></pre></td></tr></table></figure>

<h3 id="查看哪些文件没被-Git-管控"><a href="#查看哪些文件没被-Git-管控" class="headerlink" title="查看哪些文件没被 Git 管控"></a>查看哪些文件没被 Git 管控</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git ls-files --others</span><br></pre></td></tr></table></figure>

<h3 id="将未处理完的变更先保存到-stash-中"><a href="#将未处理完的变更先保存到-stash-中" class="headerlink" title="将未处理完的变更先保存到 stash 中"></a>将未处理完的变更先保存到 stash 中</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash</span><br></pre></td></tr></table></figure>

<h3 id="临时任务处理完后继续之前的工作"><a href="#临时任务处理完后继续之前的工作" class="headerlink" title="临时任务处理完后继续之前的工作"></a>临时任务处理完后继续之前的工作</h3><ul>
<li>pop 不保留 stash</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash pop</span><br></pre></td></tr></table></figure>

<ul>
<li>apply 保留 stash</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash apply</span><br></pre></td></tr></table></figure>

<h3 id="查看所有-stash"><a href="#查看所有-stash" class="headerlink" title="查看所有 stash"></a>查看所有 stash</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash list</span><br></pre></td></tr></table></figure>

<h3 id="取回某次-stash-的变更"><a href="#取回某次-stash-的变更" class="headerlink" title="取回某次 stash 的变更"></a>取回某次 stash 的变更</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash pop stash@&#123;数字n&#125;</span><br></pre></td></tr></table></figure>

<h3 id="优雅修改最后一次-commit"><a href="#优雅修改最后一次-commit" class="headerlink" title="优雅修改最后一次 commit"></a>优雅修改最后一次 commit</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git add.</span><br><span class="line">git commit --amend</span><br></pre></td></tr></table></figure>

<h3 id="使用一次新的commit，替代上一次提交"><a href="#使用一次新的commit，替代上一次提交" class="headerlink" title="使用一次新的commit，替代上一次提交"></a>使用一次新的commit，替代上一次提交</h3><p>如果代码没有任何新变化，则用来改写上一次commit的提交信息</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit --amend -m 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="重做上一次commit，并包括指定文件的新变化"><a href="#重做上一次commit，并包括指定文件的新变化" class="headerlink" title="重做上一次commit，并包括指定文件的新变化"></a>重做上一次commit，并包括指定文件的新变化</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit --amend 文件1 文件2 ...</span><br></pre></td></tr></table></figure>



<h2 id="4-分支操作"><a href="#4-分支操作" class="headerlink" title="4.分支操作"></a>4.分支操作</h2><h3 id="列出所有本地分支"><a href="#列出所有本地分支" class="headerlink" title="列出所有本地分支"></a>列出所有本地分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch</span><br></pre></td></tr></table></figure>

<h3 id="查看当前工作分支及本地分支"><a href="#查看当前工作分支及本地分支" class="headerlink" title="查看当前工作分支及本地分支"></a>查看当前工作分支及本地分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -v</span><br></pre></td></tr></table></figure>

<h3 id="列出所有本地分支和远程分支"><a href="#列出所有本地分支和远程分支" class="headerlink" title="列出所有本地分支和远程分支"></a>列出所有本地分支和远程分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -a</span><br></pre></td></tr></table></figure>

<h3 id="查看本地和远端分支"><a href="#查看本地和远端分支" class="headerlink" title="查看本地和远端分支"></a>查看本地和远端分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -av</span><br></pre></td></tr></table></figure>

<h3 id="查看远端分支"><a href="#查看远端分支" class="headerlink" title="查看远端分支"></a>查看远端分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -rv</span><br></pre></td></tr></table></figure>

<h3 id="切换到指定分支"><a href="#切换到指定分支" class="headerlink" title="切换到指定分支"></a>切换到指定分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout 指定分支</span><br></pre></td></tr></table></figure>

<h3 id="基于当前分支创建新分支，但依然停留在当前分支"><a href="#基于当前分支创建新分支，但依然停留在当前分支" class="headerlink" title="基于当前分支创建新分支，但依然停留在当前分支"></a>基于当前分支创建新分支，但依然停留在当前分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch 新分支</span><br></pre></td></tr></table></figure>

<h3 id="基于指定分支创建新分支"><a href="#基于指定分支创建新分支" class="headerlink" title="基于指定分支创建新分支"></a>基于指定分支创建新分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch 新分支 指定分支</span><br></pre></td></tr></table></figure>

<h3 id="基于某个-commit-创建分支"><a href="#基于某个-commit-创建分支" class="headerlink" title="基于某个 commit 创建分支"></a>基于某个 commit 创建分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch 新分支 某个 commit 的 id</span><br></pre></td></tr></table></figure>

<h3 id="新建一个分支，与指定的远程分支建立追踪关系"><a href="#新建一个分支，与指定的远程分支建立追踪关系" class="headerlink" title="新建一个分支，与指定的远程分支建立追踪关系"></a>新建一个分支，与指定的远程分支建立追踪关系</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch --track 分支 远程分支</span><br></pre></td></tr></table></figure>

<h3 id="建立追踪关系，在现有分支与指定的远程分支之间"><a href="#建立追踪关系，在现有分支与指定的远程分支之间" class="headerlink" title="建立追踪关系，在现有分支与指定的远程分支之间"></a>建立追踪关系，在现有分支与指定的远程分支之间</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch --set-upstream 分支 远程分支</span><br></pre></td></tr></table></figure>

<h3 id="创建并切换到该分支"><a href="#创建并切换到该分支" class="headerlink" title="创建并切换到该分支"></a>创建并切换到该分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b 新分支</span><br></pre></td></tr></table></figure>

<h3 id="切换到指定分支，并更新工作区"><a href="#切换到指定分支，并更新工作区" class="headerlink" title="切换到指定分支，并更新工作区"></a>切换到指定分支，并更新工作区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout 分支</span><br></pre></td></tr></table></figure>

<h3 id="切换到上一个分支"><a href="#切换到上一个分支" class="headerlink" title="切换到上一个分支"></a>切换到上一个分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -</span><br></pre></td></tr></table></figure>

<h3 id="列出所有远程分支"><a href="#列出所有远程分支" class="headerlink" title="列出所有远程分支"></a>列出所有远程分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -r</span><br></pre></td></tr></table></figure>

<h3 id="安全删除本地某分支"><a href="#安全删除本地某分支" class="headerlink" title="安全删除本地某分支"></a>安全删除本地某分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -d 要删除的分支</span><br></pre></td></tr></table></figure>

<h3 id="强行删除本地某分支"><a href="#强行删除本地某分支" class="headerlink" title="强行删除本地某分支"></a>强行删除本地某分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -D 要删除的分支</span><br></pre></td></tr></table></figure>

<h3 id="删除已合并到-master-分支的所有本地分支"><a href="#删除已合并到-master-分支的所有本地分支" class="headerlink" title="删除已合并到 master 分支的所有本地分支"></a>删除已合并到 master 分支的所有本地分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch --merged master | grep -v <span class="string">&#x27;^\*\| master&#x27;</span> | xargs -n 1 git branch -d</span><br></pre></td></tr></table></figure>

<h3 id="删除远端-origin-已不存在的所有本地分支"><a href="#删除远端-origin-已不存在的所有本地分支" class="headerlink" title="删除远端 origin 已不存在的所有本地分支"></a>删除远端 origin 已不存在的所有本地分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote prune orign</span><br></pre></td></tr></table></figure>

<h3 id="删除远程分支"><a href="#删除远程分支" class="headerlink" title="删除远程分支"></a>删除远程分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git push origin --delete 要删除的分支</span><br><span class="line">git branch -dr 远程分支</span><br></pre></td></tr></table></figure>

<h3 id="将-A-分支合入到当前分支中且为-merge-创建-commit"><a href="#将-A-分支合入到当前分支中且为-merge-创建-commit" class="headerlink" title="将 A 分支合入到当前分支中且为 merge 创建 commit"></a>将 A 分支合入到当前分支中且为 merge 创建 commit</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge A分支</span><br></pre></td></tr></table></figure>

<h3 id="将-A-分支合入到-B-分支中且为-merge-创建-commit"><a href="#将-A-分支合入到-B-分支中且为-merge-创建-commit" class="headerlink" title="将 A 分支合入到 B 分支中且为 merge 创建 commit"></a>将 A 分支合入到 B 分支中且为 merge 创建 commit</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge A分支 B分支</span><br></pre></td></tr></table></figure>

<h3 id="将当前分支基于-B-分支做-rebase，以便将B分支合入到当前分支"><a href="#将当前分支基于-B-分支做-rebase，以便将B分支合入到当前分支" class="headerlink" title="将当前分支基于 B 分支做 rebase，以便将B分支合入到当前分支"></a>将当前分支基于 B 分支做 rebase，以便将B分支合入到当前分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase B分支</span><br></pre></td></tr></table></figure>

<h3 id="将-A-分支基于-B-分支做-rebase，以便将-B-分支合入到-A-分支"><a href="#将-A-分支基于-B-分支做-rebase，以便将-B-分支合入到-A-分支" class="headerlink" title="将 A 分支基于 B 分支做 rebase，以便将 B 分支合入到 A 分支"></a>将 A 分支基于 B 分支做 rebase，以便将 B 分支合入到 A 分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase B分支 A分支</span><br></pre></td></tr></table></figure>

<h3 id="选择一个commit，合并进当前分支"><a href="#选择一个commit，合并进当前分支" class="headerlink" title="选择一个commit，合并进当前分支"></a>选择一个commit，合并进当前分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git cherry-pick 某个 commit 的 id</span><br></pre></td></tr></table></figure>



<h2 id="5-变更历史"><a href="#5-变更历史" class="headerlink" title="5.变更历史"></a>5.变更历史</h2><h3 id="显示当前分支的版本历史"><a href="#显示当前分支的版本历史" class="headerlink" title="显示当前分支的版本历史"></a>显示当前分支的版本历史</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure>

<h3 id="当前分支各个-commit-用一行显示"><a href="#当前分支各个-commit-用一行显示" class="headerlink" title="当前分支各个 commit 用一行显示"></a>当前分支各个 commit 用一行显示</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --oneline</span><br></pre></td></tr></table></figure>

<h3 id="显示就近的-n-个-commit"><a href="#显示就近的-n-个-commit" class="headerlink" title="显示就近的 n 个 commit"></a>显示就近的 n 个 commit</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> -n</span><br></pre></td></tr></table></figure>

<h3 id="显示commit历史，以及每次commit发生变更的文件"><a href="#显示commit历史，以及每次commit发生变更的文件" class="headerlink" title="显示commit历史，以及每次commit发生变更的文件"></a>显示commit历史，以及每次commit发生变更的文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --<span class="built_in">stat</span></span><br></pre></td></tr></table></figure>

<h3 id="用图示显示所有分支的历史"><a href="#用图示显示所有分支的历史" class="headerlink" title="用图示显示所有分支的历史"></a>用图示显示所有分支的历史</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --oneline --graph --all</span><br></pre></td></tr></table></figure>

<h3 id="搜索提交历史，根据关键词"><a href="#搜索提交历史，根据关键词" class="headerlink" title="搜索提交历史，根据关键词"></a>搜索提交历史，根据关键词</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> -S 关键词</span><br></pre></td></tr></table></figure>

<h3 id="查看涉及到某文件变更的所有-commit"><a href="#查看涉及到某文件变更的所有-commit" class="headerlink" title="查看涉及到某文件变更的所有 commit"></a>查看涉及到某文件变更的所有 commit</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> 文件</span><br></pre></td></tr></table></figure>

<h3 id="某文件各行最后修改对应的-commit-以及作者"><a href="#某文件各行最后修改对应的-commit-以及作者" class="headerlink" title="某文件各行最后修改对应的 commit 以及作者"></a>某文件各行最后修改对应的 commit 以及作者</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git blame 文件</span><br></pre></td></tr></table></figure>



<h2 id="6-标签操作"><a href="#6-标签操作" class="headerlink" title="6.标签操作"></a>6.标签操作</h2><h3 id="查看已有标签"><a href="#查看已有标签" class="headerlink" title="查看已有标签"></a>查看已有标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag</span><br></pre></td></tr></table></figure>

<h3 id="新建标签"><a href="#新建标签" class="headerlink" title="新建标签"></a>新建标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag v1.0</span><br></pre></td></tr></table></figure>

<h3 id="新建带备注标签"><a href="#新建带备注标签" class="headerlink" title="新建带备注标签"></a>新建带备注标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -a v1.0 -m <span class="string">&#x27;前端食堂&#x27;</span></span><br></pre></td></tr></table></figure>

<h3 id="给指定的-commit-打标签"><a href="#给指定的-commit-打标签" class="headerlink" title="给指定的 commit 打标签"></a>给指定的 commit 打标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag v1.0 commitid</span><br></pre></td></tr></table></figure>

<h3 id="推送一个本地标签"><a href="#推送一个本地标签" class="headerlink" title="推送一个本地标签"></a>推送一个本地标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin v1.0</span><br></pre></td></tr></table></figure>

<h3 id="推送全部未推送过的本地标签"><a href="#推送全部未推送过的本地标签" class="headerlink" title="推送全部未推送过的本地标签"></a>推送全部未推送过的本地标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin --tags</span><br></pre></td></tr></table></figure>

<h3 id="删除一个本地标签"><a href="#删除一个本地标签" class="headerlink" title="删除一个本地标签"></a>删除一个本地标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -d v1.0</span><br></pre></td></tr></table></figure>

<h3 id="删除一个远端标签"><a href="#删除一个远端标签" class="headerlink" title="删除一个远端标签"></a>删除一个远端标签</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin :refs/tags/v1.0</span><br></pre></td></tr></table></figure>

<h3 id="新建一个分支，指向某个tag"><a href="#新建一个分支，指向某个tag" class="headerlink" title="新建一个分支，指向某个tag"></a>新建一个分支，指向某个tag</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b 分支 v1.0</span><br></pre></td></tr></table></figure>



<h2 id="7-远端交互"><a href="#7-远端交互" class="headerlink" title="7.远端交互"></a>7.远端交互</h2><h3 id="查看所有远端仓库"><a href="#查看所有远端仓库" class="headerlink" title="查看所有远端仓库"></a>查看所有远端仓库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote -v</span><br></pre></td></tr></table></figure>

<h3 id="添加远端仓库，并命名"><a href="#添加远端仓库，并命名" class="headerlink" title="添加远端仓库，并命名"></a>添加远端仓库，并命名</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote add url</span><br></pre></td></tr></table></figure>

<h3 id="删除远端仓库"><a href="#删除远端仓库" class="headerlink" title="删除远端仓库"></a>删除远端仓库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote remove remote的名称</span><br></pre></td></tr></table></figure>

<h3 id="重命名远端仓库"><a href="#重命名远端仓库" class="headerlink" title="重命名远端仓库"></a>重命名远端仓库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote rename 旧名称 新名称</span><br></pre></td></tr></table></figure>

<h3 id="将远端所有分支和标签的变更都拉到本地"><a href="#将远端所有分支和标签的变更都拉到本地" class="headerlink" title="将远端所有分支和标签的变更都拉到本地"></a>将远端所有分支和标签的变更都拉到本地</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch remote</span><br></pre></td></tr></table></figure>

<h3 id="把远端分支的变更拉到本地，且-merge-到本地分支"><a href="#把远端分支的变更拉到本地，且-merge-到本地分支" class="headerlink" title="把远端分支的变更拉到本地，且 merge 到本地分支"></a>把远端分支的变更拉到本地，且 merge 到本地分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull origin 分支名</span><br></pre></td></tr></table></figure>

<h3 id="下载远程仓库的所有变动"><a href="#下载远程仓库的所有变动" class="headerlink" title="下载远程仓库的所有变动"></a>下载远程仓库的所有变动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch remote的名称</span><br></pre></td></tr></table></figure>

<h3 id="将本地分支-push-到远端"><a href="#将本地分支-push-到远端" class="headerlink" title="将本地分支 push 到远端"></a>将本地分支 push 到远端</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin 分支名</span><br></pre></td></tr></table></figure>

<h3 id="强行推送当前分支到远程仓库，即使有冲突"><a href="#强行推送当前分支到远程仓库，即使有冲突" class="headerlink" title="强行推送当前分支到远程仓库，即使有冲突"></a>强行推送当前分支到远程仓库，即使有冲突</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push remote的名称 --force</span><br></pre></td></tr></table></figure>

<h3 id="推送所有分支到远程仓库"><a href="#推送所有分支到远程仓库" class="headerlink" title="推送所有分支到远程仓库"></a>推送所有分支到远程仓库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push remote的名称 --all</span><br></pre></td></tr></table></figure>

<h3 id="删除远端分支"><a href="#删除远端分支" class="headerlink" title="删除远端分支"></a>删除远端分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git push remote --delete 远端分支名</span><br><span class="line">git push remote :远端分支名</span><br></pre></td></tr></table></figure>



<h2 id="8-撤销"><a href="#8-撤销" class="headerlink" title="8.撤销"></a>8.撤销</h2><h3 id="恢复暂存区的指定文件到工作区"><a href="#恢复暂存区的指定文件到工作区" class="headerlink" title="恢复暂存区的指定文件到工作区"></a>恢复暂存区的指定文件到工作区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout 文件</span><br></pre></td></tr></table></figure>

<h3 id="恢复某个commit的指定文件到暂存区和工作区"><a href="#恢复某个commit的指定文件到暂存区和工作区" class="headerlink" title="恢复某个commit的指定文件到暂存区和工作区"></a>恢复某个commit的指定文件到暂存区和工作区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout 提交信息 文件</span><br></pre></td></tr></table></figure>

<h3 id="恢复暂存区的所有文件到工作区"><a href="#恢复暂存区的所有文件到工作区" class="headerlink" title="恢复暂存区的所有文件到工作区"></a>恢复暂存区的所有文件到工作区</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout .</span><br></pre></td></tr></table></figure>

<h3 id="重置暂存区的指定文件，与上一次commit保持一致，但工作区不变"><a href="#重置暂存区的指定文件，与上一次commit保持一致，但工作区不变" class="headerlink" title="重置暂存区的指定文件，与上一次commit保持一致，但工作区不变"></a>重置暂存区的指定文件，与上一次commit保持一致，但工作区不变</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset 文件</span><br></pre></td></tr></table></figure>

<h3 id="重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变"><a href="#重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变" class="headerlink" title="重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变"></a>重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard</span><br></pre></td></tr></table></figure>

<h3 id="重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变-1"><a href="#重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变-1" class="headerlink" title="重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变"></a>重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致"><a href="#重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致" class="headerlink" title="重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致"></a>重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="重置当前HEAD为指定commit，但保持暂存区和工作区不变"><a href="#重置当前HEAD为指定commit，但保持暂存区和工作区不变" class="headerlink" title="重置当前HEAD为指定commit，但保持暂存区和工作区不变"></a>重置当前HEAD为指定commit，但保持暂存区和工作区不变</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --keep 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="新建一个commit，用来撤销指定commit"><a href="#新建一个commit，用来撤销指定commit" class="headerlink" title="新建一个commit，用来撤销指定commit"></a>新建一个commit，用来撤销指定commit</h3><p>后者的所有变化都将被前者抵消，并且应用到当前分支</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert 提交信息</span><br></pre></td></tr></table></figure>

<h3 id="暂时将未提交的变化移除，稍后再移入"><a href="#暂时将未提交的变化移除，稍后再移入" class="headerlink" title="暂时将未提交的变化移除，稍后再移入"></a>暂时将未提交的变化移除，稍后再移入</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git stash</span><br><span class="line">git stash pop</span><br></pre></td></tr></table></figure>



<h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210606172913.png" alt="img"></p>
<p><strong>相关文章：</strong></p>
<p><a target="_blank" rel="noopener" href="http://www.ruanyifeng.com/blog/2019/12/git-undo.html">《如何撤销 Git 操作？》(opens new window)</a></p>
<p><a target="_blank" rel="noopener" href="http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html">《git cherry-pick 教程》 (opens new window)</a>复制某分支上的部分提交到另一个分支上（相对于可以选择指定提交的 rebase 操作）。</p>
<h1 id="附录一：Git变基合并"><a href="#附录一：Git变基合并" class="headerlink" title="附录一：Git变基合并"></a>附录一：Git变基合并</h1><h2 id="1-说明"><a href="#1-说明" class="headerlink" title="1.说明"></a>1.说明</h2><p>以下 <code>v2</code> 是某个需求的开发分支， <code>dev</code>是总的开发分支，<code>v2</code> 是基于<code>dev</code>分支签出的。</p>
<p>当完成<code>v2</code>的开发后，需要把代码合并到<code>dev</code>，我们可以使用<code>rebase</code>进行合并：</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 首先将 v2 push到远程仓库</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&#x27;xxx&#x27;</span></span><br><span class="line">git push origin v2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换到 dev 拉取最新代码</span></span><br><span class="line">git checkout dev</span><br><span class="line">git pull origin dev</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换到 v2</span></span><br><span class="line">git checkout v2</span><br><span class="line">git rebase dev <span class="comment"># 将 v2 的所有[commit] 变基到(应用到) dev</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换到 dev</span></span><br><span class="line">git checkout dev</span><br><span class="line">git merge v2  <span class="comment"># 将 dev分支 快进合并 （此时 (HEAD -&gt; dev, v2) [commit] 两个分支指向同一个提交）</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看 原v2的[commit]记录 是否在dev分支的最前面（变基成功会把v2的提交记录应用到dev分支的最前面）</span></span><br><span class="line">git <span class="built_in">log</span></span><br><span class="line"></span><br><span class="line">	<span class="comment"># 如果到这一步发现有问题，尝试使用 git --abort中止变基，如果还是有问题的可以在dev分支上使用《后悔药》操作， 再到v2分支上使用《后悔药》操作，即可使两个分支都回退到 rebase变基 之前的状态</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 试运行项目是否有问题</span></span><br><span class="line">yarn start</span><br><span class="line"></span><br><span class="line">git status <span class="comment"># 查看状态是否有问题</span></span><br><span class="line">git push origin dev <span class="comment"># 推送到远程仓库的 dev</span></span><br></pre></td></tr></table></figure>

<h3 id="1-1-变基要遵守的准则"><a href="#1-1-变基要遵守的准则" class="headerlink" title="1.1 变基要遵守的准则"></a>1.1 变基要遵守的准则</h3><p><strong>几个人同时在一个分支上进行开发和提交时，你不要中途执行变基，只有在大家都完成工作之后才可以执行变基。</strong></p>
<h3 id="1-2-变基的实质"><a href="#1-2-变基的实质" class="headerlink" title="1.2 变基的实质"></a>1.2 变基的实质</h3><p>变基操作的实质是丢弃一些现有的提交，然后相应地新建一些内容一样但实际上不同的提交。 因此，<strong>变基操作过后的分支将不要再使用</strong>。</p>
<h2 id="2-后悔药"><a href="#2-后悔药" class="headerlink" title="2.后悔药"></a>2.后悔药</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看HEAD指针变动记录</span></span><br><span class="line">git reflog</span><br><span class="line"><span class="comment"># 记录示例(当前分支是v2):</span></span><br><span class="line">07c398f (HEAD -&gt; v2, master) HEAD@&#123;0&#125;: checkout: moving from master to v2</span><br><span class="line">07c398f (HEAD -&gt; v2, master) HEAD@&#123;1&#125;: rebase (finish): returning to refs/heads/master</span><br><span class="line">07c398f (HEAD -&gt; v2, master) HEAD@&#123;2&#125;: rebase (start): checkout v2</span><br><span class="line">15a97d8 HEAD@&#123;3&#125;: reset: moving to 15a97d8</span><br><span class="line">07c398f (HEAD -&gt; v2, master) HEAD@&#123;4&#125;: merge v2: Fast-forward</span><br><span class="line">15a97d8 HEAD@&#123;5&#125;: checkout: moving from v2 to master</span><br><span class="line">07c398f (HEAD -&gt; v2, master) HEAD@&#123;6&#125;: rebase (finish): returning to refs/heads/v2</span><br><span class="line">07c398f (HEAD -&gt; v2, master) HEAD@&#123;7&#125;: rebase (pick): C</span><br><span class="line">15a97d8 HEAD@&#123;8&#125;: rebase (start): checkout master <span class="comment"># 首次rebase</span></span><br><span class="line">d278ecd HEAD@&#123;9&#125;: checkout: moving from master to v2 <span class="comment"># rebase前的状态</span></span><br><span class="line">15a97d8 HEAD@&#123;10&#125;: commit: D</span><br><span class="line"></span><br><span class="line"><span class="comment"># 可见，示例中最初的 rebase 操作是 HEAD@&#123;8&#125;，想回退到变基前的状态需让指针指向 HEAD@&#123;9&#125;</span></span><br><span class="line">git reset --hard d278ecd  <span class="comment"># 重置当前分支的HEAD为指定[commit]，同时重置暂存区和工作区，与指定[commit]一致</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 此时打印 log 查看是否回到之前的状态</span></span><br><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure>

<p><strong>注意：此操作只能回退当前的分支，如其他分支也要回退，需要切换到该分支并执行上面操作。</strong></p>
<h2 id="3-开发期间的rebase操作"><a href="#3-开发期间的rebase操作" class="headerlink" title="3.开发期间的rebase操作"></a>3.开发期间的rebase操作</h2><h3 id="3-1-背景"><a href="#3-1-背景" class="headerlink" title="3.1 背景"></a>3.1 背景</h3><p>有两个分支：</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dev</span><br><span class="line">*v2</span><br></pre></td></tr></table></figure>

<p><code>2.4-dev</code> 是基于<code>dev</code>切出来的。</p>
<p>提交记录如下：</p>
<figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">		dev</span><br><span class="line">a - b - c</span><br><span class="line">		v2</span><br></pre></td></tr></table></figure>

<p>开发期间，两个分支同时有新的commit ：</p>
<figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">				dev</span><br><span class="line">a - b - c - d - e</span><br><span class="line">		\ - f - g</span><br><span class="line">				v2</span><br></pre></td></tr></table></figure>

<p>当前你正在<code>v2</code>进行开发，<code>dev</code>也同时进行开发，并有重大的改变，你需要把<code>dev</code>的提交同步到<code>v2</code>。</p>
<p><strong>需求： 把<code>dev</code>中新的提交同步到<code>v2</code>，且不能影响<code>dev</code>分支。</strong></p>
<h3 id="3-2-操作步骤"><a href="#3-2-操作步骤" class="headerlink" title="3.2 操作步骤"></a>3.2 操作步骤</h3><ol>
<li><p>基于最新的 <code>dev</code> 切一个新的分支 <code>dev-copy</code></p>
<blockquote>
<p><code>dev-copy</code> 和 <code>dev</code> 两者的 commit ID 一致。</p>
</blockquote>
</li>
<li><p>在<code>dev-copy</code>中执行rebase，将 <code>dev-copy</code> 的提交变基到 <code>v2</code></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase v2 <span class="comment"># 将 dev-copy 的提交[commit] 变基到(应用到) v2</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>删除原<code>v2</code>分支，将<code>dev-copy</code>分支名改为<code>v2</code></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 当前在 dev-copy 分支</span></span><br><span class="line">git branch -d v2 <span class="comment"># 删除分支</span></span><br><span class="line">git branch -m dev-copy v2 <span class="comment"># 重命名</span></span><br></pre></td></tr></table></figure>

</li>
</ol>
<h3 id="3-3-git-cherry-pick"><a href="#3-3-git-cherry-pick" class="headerlink" title="3.3 git cherry-pick"></a>3.3 git cherry-pick</h3><p>来源：<a target="_blank" rel="noopener" href="http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html">《git cherry-pick 教程》</a></p>
<p>用于将单个或几个<code>[commit]</code>复制到另一个分支。</p>
<h4 id="基本应用"><a href="#基本应用" class="headerlink" title="基本应用"></a>基本应用</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git cherry-pick &lt;commitHash&gt; <span class="comment"># 将commitHash应用于当前分支</span></span><br></pre></td></tr></table></figure>

<p>上面命令就会将指定的提交<code>commitHash</code>，应用于当前分支。这会在当前分支产生一个新的提交，当然它们的<strong>哈希值会不一样</strong>。</p>
<p>git cherry-pick命令的参数，不一定是提交的哈希值，分支名也是可以的，表示转移该分支的最新提交。</p>
<h4 id="转移多个提交"><a href="#转移多个提交" class="headerlink" title="转移多个提交"></a>转移多个提交</h4><p>Cherry pick 支持一次转移多个提交。</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git cherry-pick &lt;HashA&gt; &lt;HashB&gt; <span class="comment"># A和B提交</span></span><br></pre></td></tr></table></figure>

<p>上面的命令将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。</p>
<p>如果想要转移一系列的连续提交，可以使用下面的简便语法。</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git cherry-pick A..B <span class="comment"># A到B提交，不包含A</span></span><br></pre></td></tr></table></figure>

<p>上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置：提交 A 必须早于提交 B，否则命令将失败，但不会报错。</p>
<p><strong>注意，使用上面的命令，提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A，可以使用下面的语法。</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git cherry-pick A^..B <span class="comment"># A到B提交，包含A</span></span><br></pre></td></tr></table></figure>



<h1 id="附录二：git干货，花整整两天吐血整理"><a href="#附录二：git干货，花整整两天吐血整理" class="headerlink" title="附录二：git干货，花整整两天吐血整理"></a>附录二：<a target="_blank" rel="noopener" href="https://www.nowcoder.com/discuss/433766">git干货，花整整两天吐血整理</a></h1><p>本质上就是 <a target="_blank" rel="noopener" href="https://learngitbranching.js.org/">Learning Git Branching</a>这个网站教程的文字版本</p>
<h2 id="0-精髓总结"><a href="#0-精髓总结" class="headerlink" title="0.精髓总结"></a>0.精髓总结</h2><p> <strong>让本地开发分支跟远程实现关联，是很棒的一件事！可以省掉很多参数，利用关联性实现简写。</strong> </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git pull 等于 git fetch + git merge FETCH_HEAD</span><br><span class="line">git push  //啥都不加相当于把HEAD所在分支push到远程关联分支。 git pull //啥都不加也相当于把HEAD所在分支对应的远程分支拉到HEAD所在分支并merge git pull --rebase //啥都不加也同上</span><br><span class="line">git push &lt;远程主机名&gt; &lt;本地分支名&gt;：&lt;远程分支名&gt; 如果省略远程分支名，则表示将本地分支推送至与之存在“追踪关系”的远程分支（通常两者同名），如果该远程分支不存在，则会被新建：git push origin master</span><br></pre></td></tr></table></figure>



<h2 id="1-Git中的‘HEAD’是什么？"><a href="#1-Git中的‘HEAD’是什么？" class="headerlink" title="1.Git中的‘HEAD’是什么？"></a>1.Git中的‘HEAD’是什么？</h2><p> <strong>又名检出（checkout）位置</strong> </p>
<h3 id="1-1-问题来源"><a href="#1-1-问题来源" class="headerlink" title="1.1 问题来源"></a>1.1 问题来源</h3><p> git 恢复文件到初始状态的命令： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset HEAD &lt;file&gt;</span><br></pre></td></tr></table></figure>

<p> git 展示提交日志命令： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> commit c4f9d71863ab78cfca754c78e9f0f2bf66a2bd77 (HEAD -&gt; master)</span><br></pre></td></tr></table></figure>

<p> 在这些命令中常常会看到HEAD这个名词，它指的是什么呢？ </p>
<h3 id="1-2-回答"><a href="#1-2-回答" class="headerlink" title="1.2  回答"></a>1.2  回答</h3><p>  这要从git的分支说起， <strong>git 中的分支，</strong> 本质上仅仅 <strong>是个指向 commit 对象的可变指针</strong> 。git 是如何知道你当前在哪个分支上工作的呢？   其实答案也很简单，它保存着一个 <strong>名为 HEAD 的特别指针</strong> 。在 git 中， <strong>指向你正在工作中的本地分支</strong> ，可以将 HEAD 想象为当前分支的别名。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420170433.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420171338.png" alt="img"></p>
<h2 id="2-合并分支的两种方法：git-merge-amp-git-rebase"><a href="#2-合并分支的两种方法：git-merge-amp-git-rebase" class="headerlink" title="2.合并分支的两种方法：git merge &amp; git rebase"></a>2.合并分支的两种方法：git merge &amp; git rebase</h2><h3 id="2-1-git-merge"><a href="#2-1-git-merge" class="headerlink" title="2.1 git merge"></a>2.1 git merge</h3><p>  git merge 在 Git 中合并两个分支时会产生一个特殊的提交记录，它有两个父节点。翻译成自然语言相当于：“我要把这 <strong>两个父节点本身及它们所有的祖先</strong> 都包含进来。” </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420171930.png" alt="img">  </p>
<h3 id="2-2-git-rebase"><a href="#2-2-git-rebase" class="headerlink" title="2.2 git rebase"></a>2.2 git rebase</h3><p> Rebase 实际上就是取出<strong>一系列(整条分支)**的提交记录，</strong>“复制”它们，然后在另外一个地方逐个的放下去**。 </p>
<p>  Rebase 的优势就是 <strong>可以创造更线性的提交历史</strong> ，这听上去有些难以理解。如果只允许使用 Rebase 的话，代码库的 <strong>提交历史将会变得异常清晰</strong> 。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420172100.png" alt="img">  </p>
<p> <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420172527.png" alt="img"> </p>
<p> <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420172559.png" alt="img"> </p>
<p> <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420173100.png" alt="img"> </p>
<p> 在开发社区里，有许多关于 merge 与 rebase 的讨论。以下是关于 <strong>rebase 的优缺点</strong>： </p>
<p> 优点: </p>
<ul>
<li><p>Rebase 使你的<strong>提交树变得很干净, 所有的提交都在一条线上</strong> </p>
<p>缺点 </p>
</li>
<li><p>Rebase <strong>修改了提交树的历史</strong> </p>
<p>比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的，但实际上是在 C3 之前。 </p>
</li>
</ul>
<p> <strong>一些开发人员喜欢保留提交历史，因此更偏爱 merge。</strong>而其他人（比如我自己）可能更喜欢干净的提交树，于是偏爱 rebase。仁者见仁，智者见智。</p>
<h2 id="3-什么是fast-forward-和no-fast-forward？"><a href="#3-什么是fast-forward-和no-fast-forward？" class="headerlink" title="3.什么是fast-forward 和no-fast-forward？"></a>3.什么是fast-forward 和no-fast-forward？</h2><p> 从一个分支获取变更到另一个分支的方式之一是执行git merge命令。Git 有两类合并操作：<strong>fast-forward</strong> 和<strong>no-fast-forward</strong>。 </p>
<p> 这么说你可能没什么概念，我们来看看区别吧。 </p>
<h3 id="3-1-fast-forward-–ff"><a href="#3-1-fast-forward-–ff" class="headerlink" title="3.1 fast-forward (–ff)"></a>3.1 fast-forward (–ff)</h3><p>  如果当前分支与即将合并过来的分支相比，没有额外的提交，这种就是 fast-forward 合并。Git 很会偷懒，它会首先尝试最简单的方案，即 fast-forward 。这种合并方式不会创建新的提交，只是把另一个分支的提交记录直接合并到当前分支。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420173351.gif" alt="img"></p>
<p>  fast-forward merge </p>
<h3 id="3-2-no-fast-foward-–no-ff"><a href="#3-2-no-fast-foward-–no-ff" class="headerlink" title="3.2 no-fast-foward (–no-ff)"></a>3.2 no-fast-foward (–no-ff)</h3><p> 跟即将合并过来的分支比较，当前分支如果没有额外的提交，这固然很好，但实际情况往往不是这样！如果我们在当前分支上也提交了一些改动，那么 Git 就会执行no-fast-forward合并。 </p>
<p>  对于  no-fast-forward  合并，Git 会在当前分支上创建一个新的 <strong>合并提交</strong> 。该提交的父提交同时指向当前分支和合并过来的分支。 </p>
<p>  <img data-src="https://uploadfiles.nowcoder.com/images/20200529/933639781_1590755612864_38630241A8024EA006101538D9D640D5" alt="img"> </p>
<p>  no-fast-forward </p>
<p> 也没毛病！现在master分支上有了我们在dev分支上做的所有变更。</p>
<h2 id="4-分离HEAD的方法-git-checkout"><a href="#4-分离HEAD的方法-git-checkout" class="headerlink" title="4.分离HEAD的方法: git checkout"></a>4.分离HEAD的方法: git checkout</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout  提交记录的哈希值(前缀)/HEAD的相对引用  HEAD^代表HEAD的上一次提交 HEAD^^代表HEAD的上上次提交 HEAD~6代表HEAD的第前六次提交 HEAD~不加数字也代表HEAD的上一次提交  //敲黑板 HEAD^2的意思不一样，是第二个父亲，而HEAD~2的意思是父亲的父亲（爷爷）</span><br></pre></td></tr></table></figure>

<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420173613.png" alt="img"></p>
<h2 id="5-相对引用"><a href="#5-相对引用" class="headerlink" title="5.相对引用"></a>5.相对引用</h2><p> 我使用相对引用最多的就是移动分支。可以直接使用 -f 选项<strong>让分支指向另一个提交</strong>。例如: </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -f master HEAD~3</span><br></pre></td></tr></table></figure>

<p>  上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420174612.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420174634.png" alt="img"></p>
<h2 id="6-撤销提交的两种方法：git-reset-amp-git-revert"><a href="#6-撤销提交的两种方法：git-reset-amp-git-revert" class="headerlink" title="6.撤销提交的两种方法：git reset &amp; git revert"></a>6.撤销提交的两种方法：git reset &amp; git revert</h2><p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420214815.png" alt="img"></p>
<p> 虽然在你的本地分支中使用 git reset 很方便，但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦！<strong>想要让远程分支改写历史要怎么办呢？使用 git revert <commit> 可以撤销指定的提交</strong>， 要撤销一串提交可以用 <commit1>..<commit2> 语法。 注意这是一个前开后闭区间，即不包括 commit1，但包括 commit2。</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git revert HEAD 意思是撤销HEAD指向的这个提交</span><br></pre></td></tr></table></figure>

<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420215516.png" alt="img"></p>
<h2 id="7-整理提交记录-git-cherry-pick-amp-git-rebase-i"><a href="#7-整理提交记录-git-cherry-pick-amp-git-rebase-i" class="headerlink" title="7.整理提交记录:git cherry-pick &amp; git rebase -i"></a>7.整理提交记录:git cherry-pick &amp; git rebase -i</h2><p>开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式，非常清晰、灵活，还很生动。看起来挺复杂, 其实是个很简单的概念。 </p>
<h3 id="7-1-第一个命令是-git-cherry-pick"><a href="#7-1-第一个命令是-git-cherry-pick" class="headerlink" title="7.1 第一个命令是 git cherry-pick"></a>7.1 第一个命令是 git cherry-pick</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git cherry-pick &lt;提交号&gt;... </span><br></pre></td></tr></table></figure>

<p>  如果你想将一些提交复制到当前所在的位置（ HEAD ）下面的话， Cherry-pick 是最直接的方式了。我个人非常喜欢  cherry-pick ，因为它特别简单。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420215552.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420215639.png" alt="img"></p>
<p>当你知道你所需要的提交记录（<strong>并且还知道这些提交记录的哈希值</strong>）时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。 </p>
<p> <em>多个commit 只需要git cherry-pickcommitid1..commitid100</em> </p>
<p> 注意，不包含第一个commitid ， 即 <strong>git cherry-pick (commitid1..commitid100]</strong> </p>
<p> 如果想搞成[]区间，使用 git cherry-pick A^..B 相当于[A B]包含A </p>
<p> 但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了 </p>
<h3 id="7-2-第二个命令是-交互式的rebase"><a href="#7-2-第二个命令是-交互式的rebase" class="headerlink" title="7.2 第二个命令是 交互式的rebase"></a>7.2 第二个命令是 交互式的rebase</h3><p> 交互式 rebase 指的是使用带参数 –interactive 的 rebase 命令, 简写为 -i </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase -i HEAD~4</span><br></pre></td></tr></table></figure>

<p> 如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录，它还会显示每个提交记录的哈希值和提交说明，提交说明有助于你理解这个提交进行了哪些更改。 </p>
<p> 在实际使用时，所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。 </p>
<p> <strong>当 rebase UI界面打开时</strong>, 你能做3件事: </p>
<ul>
<li> 调整提交记录的顺序（通过鼠标拖放来完成） </li>
<li> 删除你不想要的提交（通过切换 pick 的状态来完成，关闭就意味着你不想要这个提交记录） </li>
<li>​    合并提交。 它允许你把多个提交记录合并成一个。</li>
</ul>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221200.png" alt="img"></p>
<p>【应用： <strong>本地栈式提交（注意提交只能是本地的！！！）</strong> 】</p>
<p>来看一个在开发中经常会遇到的情况：我正在解决某个特别棘手的 Bug，为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。</p>
<p>这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因，解决掉以后觉得沾沾自喜！ </p>
<p> 最后就差把 bugFix 分支里的工作合并回 master 分支了。你可以选择通过 fast-forward 快速合并到 master 分支上，但这样的话 master 分支就会包含我这些调试语句了。你肯定不想这样，应该还有更好的方式…… </p>
<p> 实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样，我们可以使用 </p>
<ul>
<li><p> git rebase -i </p>
</li>
<li><p>git cherry-pick </p>
<p>来达到目的。 </p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221736.png" alt="img"></p>
</li>
</ul>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221755.png" alt="img"></p>
<h2 id="8-添加锚点：git-tag"><a href="#8-添加锚点：git-tag" class="headerlink" title="8.添加锚点：git tag"></a>8.添加锚点：git tag</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag v1 c1 //打v1标签到提交c1上</span><br></pre></td></tr></table></figure>

<p> 有没有什么可以<em>永远</em>指向某个提交记录的标识呢，比如软件发布新的大版本，或者是修正一些重要的 Bug 或是增加了某些新特性，有没有比分支更好的可以永远指向这些提交的方法呢？ </p>
<p> Git 的 tag 就是干这个用的啊，它们可以（在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签）永久地将某个特定的提交命名为里程碑，然后就可以像分支一样引用了。 </p>
<p>  <strong>更难得的是，它们并不会随着新的提交而移动。</strong> 你也不能检出到某个标签上面进行修改提交，它就像是提交树上的一个锚点，标识了某个特定的位置。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221817.png" alt="img"></p>
<h2 id="9-描述离你最近的锚点（也就是标签）-git-describe"><a href="#9-描述离你最近的锚点（也就是标签）-git-describe" class="headerlink" title="9.描述离你最近的锚点（也就是标签）:git describe"></a>9.<strong>描述</strong>离你最近的锚点（也就是标签）:git describe</h2><p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221836.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221847.png" alt="img"></p>
<h2 id="10-拉取远程仓库：git-clone"><a href="#10-拉取远程仓库：git-clone" class="headerlink" title="10.拉取远程仓库：git clone"></a>10.拉取远程仓库：git clone</h2><p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420221917.png" alt="img"><br>   既然你已经看过 git clone 命令了，咱们深入地看一下发生了什么。 </p>
<p> 你可能注意到的第一个事就是在我们的<strong>本地仓库多了一个名为 o/master 的分支, 这种类型的分支就叫远程分支</strong>。由于远程分支的特性导致其拥有一些特殊属性。 </p>
<p> 远程分支反映了远程仓库(在你上次和它通信时)的状态。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步. </p>
<p> 远程分支有一个特别的属性，在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, <strong>你必须在别的地方完成你的工作, （更新了远程分支之后）再用远程分享你的工作成果。</strong> </p>
<p> 远程分支有一个命名规范 —— 它们的格式是: </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;remote name&gt;/&lt;branch name&gt; </span><br></pre></td></tr></table></figure>

<p>   因此，如果你看到一个名为 o/master 的分***么这个分支就叫 master，远程仓库的名称就是 o。 </p>
<p> 大多数的开发人员会将它们主要的远程仓库命名为 origin，并不是 o。这是因为当你用 git clone 某个仓库时，<strong>Git 已经帮你把远程仓库的名称设置为 origin 了</strong></p>
<h2 id="12-git-fetch"><a href="#12-git-fetch" class="headerlink" title="12.git fetch"></a>12.git fetch</h2><p> git fetch 完成了仅有的但是很重要的两步: </p>
<ul>
<li><p> 从远程仓库下载本地仓库中缺失的提交记录 </p>
</li>
<li><p>更新远程分支指针(如 o/master) </p>
<p>git fetch 实际上<strong>将本地仓库中的远程分支</strong>更新成了<strong>远程仓库相应分支最新的状态</strong>。 </p>
<p>如果你还记得上一节课程中我们说过的，远程分支反映了远程仓库在你 <strong>最后一次与它通信时</strong> 的状态， git fetch  就是你与远程仓库通信的方式了！ git fetch  通常通过互联网（使用  http://  或  git://  协议) 与远程仓库通信。 </p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420222547.png" alt="img"><br> <strong>git fetch 不会做的事</strong> </p>
</li>
</ul>
<p> <strong>git fetch 并不会改变你本地仓库的状态。它不会更新你的 master 分支，也不会修改你磁盘上的文件。</strong> </p>
<p> 理解这一点很重要，因为许多开发人员误以为执行了 git fetch 以后，他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来，<strong>但是并没有修改你本地的文件</strong>。我们在后面的课程中将会讲解能完成该操作的命令 . </p>
<p> 所以, 你可以将 git fetch 的理解为单纯的下载操作。</p>
<h2 id="13-git-pull"><a href="#13-git-pull" class="headerlink" title="13.git pull"></a>13.git pull</h2><p> 既然我们已经知道了如何用 git fetch 获取远程的数据, 现在我们学习如何将这些变化更新到我们的工作当中。 </p>
<p> 其实有很多方法的 —— 当远程分支中有新的提交时，你可以像合并本地分***样来合并远程分支。也就是说就是你可以执行以下命令: </p>
<ul>
<li><pre><code class="sh">git cherry-pick o/master 
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- &#96;&#96;&#96;sh</span><br><span class="line">  git rebase o&#x2F;master </span><br></pre></td></tr></table></figure>
</code></pre>
</li>
<li><pre><code class="sh">git merge o/master 
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">-  等等 </span><br><span class="line"></span><br><span class="line">实际上，由于先抓取更新再合并到本地分支这个流程很常用，因此 Git 提供了一个专门的命令来完成这两个操作。它就是我们要讲的  git pull 。 </span><br><span class="line"></span><br><span class="line">![img](https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;gh&#x2F;huxingyi1997&#x2F;my_img&#x2F;img&#x2F;20210420222633.png)</span><br><span class="line"></span><br><span class="line">![img](https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;gh&#x2F;huxingyi1997&#x2F;my_img&#x2F;img&#x2F;20210420222647.png)</span><br><span class="line"></span><br><span class="line">![img](https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;gh&#x2F;huxingyi1997&#x2F;my_img&#x2F;img&#x2F;20210420222654.png)</span><br><span class="line"></span><br><span class="line">&#96;&#96;&#96;sh</span><br><span class="line">git pull --rebase &#x2F;&#x2F;我个人更喜欢这个</span><br></pre></td></tr></table></figure>

其实也可以像下面这样： 
</code></pre>
</li>
</ul>
<p> <strong>暂存，拉取，恢复暂存，合并(如果有冲突)，提交，推送</strong> </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash :暂存本地代码 git pull origin develop : 获取远程分支代码 git stash pop:恢复之前暂存的文件</span><br></pre></td></tr></table></figure>



<h2 id="14-git-push"><a href="#14-git-push" class="headerlink" title="14.git push"></a>14.git push</h2><p>git push  负责将 <strong>你的</strong> 变更上传到指定的远程仓库，并在远程仓库上合并你的新提交记录。一旦  git push  完成, 你的朋友们就可以从这个远程仓库下载你分享的成果了！ </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223050.png" alt="img"></p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223106.png" alt="img"> </p>
<p> 【敲黑板：一直以来的误解！！<strong>原来git push的时候交上去的不是一个提交，而是以检出位置HEAD为出发点，把所有的子子孙孙全部push上去，即这个提交距离origin/master之间的所有提交及新建的分支</strong>，所以说提交需谨慎啊！】 </p>
<p>  【git merge, git pull ,看的是 <strong>检出(checkout)位置HEAD</strong> 在哪，就merge到哪】</p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223123.png" alt="img"></p>
<p>执行git push之后，c3 c4都会一起过去远程分支。可以理解成三大同步！！！分别是origin,origin/master以及本地master!</p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223635.png" alt="img"></p>
<h2 id="15-偏离的历史提交"><a href="#15-偏离的历史提交" class="headerlink" title="15.偏离的历史提交"></a>15.偏离的历史提交</h2><p>假设你周一克隆了一个仓库，然后开始研发某个新功能。到周五时，你新功能开发测试完毕，可以发布了。但是 —— 天啊！你的同事这周写了一堆代码，还改了许多你的功能中使用的 API，这些变动会导致你新开发的功能变得不可用。但是他们已经将那些提交推送到远程仓库了，因此你的工作就变成了基于<strong>项目旧版</strong>的代码，与远程仓库最新的代码不匹配了。 </p>
<p> 这种情况下, git push 就不知道该如何操作了。如果你执行 git push，Git 应该让远程仓库回到星期一那天的状态吗？还是直接在新代码的基础上添加你的代码，亦或由于你的提交已经过时而直接忽略你的提交？ </p>
<p>  因为这情况（历史偏离）有许多的不确定性，Git 是不会允许你  push  变更的。实际上它会强制你先合并远程最新的代码，然后才能分享你的工作。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223823.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223837.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223846.png" alt="img"></p>
<p>很好！但是要敲那么多命令，有没有更简单一点的？ </p>
<p>  当然 —— 前面已经介绍过  <strong>git pull 就是 fetch 和 merge 的简写，类似的 git pull –rebase 就是 fetch 和 rebase 的简写！</strong> </p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420223914.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224028.png" alt="img"></p>
<h2 id="16-远程服务器拒绝-Remote-Rejected"><a href="#16-远程服务器拒绝-Remote-Rejected" class="headerlink" title="16.远程服务器拒绝!(Remote Rejected)"></a>16.远程服务器拒绝!(Remote Rejected)</h2><p> 如果你是在一个大的合作团队中工作, 很可能是master被锁定了, 需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地master, 然后试图推送(push)修改, 你将会收到这样类似的信息: </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">! [远程服务器拒绝] master -&gt; master (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)</span><br></pre></td></tr></table></figure>

<p>  <strong>为什么会被拒绝?</strong> </p>
<p> 远程服务器拒绝直接推送(push)提交到master, 因为策略配置要求 pull requests 来提交更新. </p>
<p> 你<strong>应该按照流程,新建一个分支, 推送(push)这个分支</strong>并申请pull request. </p>
<p> 但是你忘记并直接提交给了master.现在你卡住并且无法推送你的更新. </p>
<p> <strong>解决办法（不是很懂？）</strong> </p>
<p> <strong>新建一个分支feature, 推送到远程服务器(实质上就是间接地给远程服务器新建了一个feature分支，然后变成以后推东西到这个feature分支了，这样同事之间开发互不干扰，也可以避免提交的时候跟他人发生冲突).</strong> 然后reset你的master分支和远程服务器保持一致, 否则下次你pull并且他人的提交和你冲突的时候就会有问题.</p>
<h2 id="17-远程追踪"><a href="#17-远程追踪" class="headerlink" title="17.远程追踪"></a>17.远程追踪</h2><p> 在前几节课程中有件事儿挺神奇的，Git 好像知道 master 与 o/master 是相关的。当然这些分支的名字是相似的，可能会让你觉得是依此将远程分支 master 和本地的 master 分支进行了关联。这种关联在以下两种情况下可以清楚地得到展示： </p>
<ul>
<li><p> pull 操作时, 提交记录会被先下载到 o/master 上，之后再合并到本地的 master 分支。隐含的合并目标由这个关联确定的。 </p>
</li>
<li><p>push 操作时, 我们把工作从 master 推到远程仓库中的 master 分支(同时会更新远程分支 o/master) 。这<a href="">个推</a>送的目的地也是由这种关联确定的！ </p>
<p>直接了当地讲，master 和 o/master 的关联关系就是由分支的“remote tracking”属性决定的。master 被设定为跟踪 o/master —— 这意味着为 master 分支指定了推送的目的地以及拉取后合并的目标。 </p>
<p>你可能想知道 master 分支上这个属性是怎么被设定的，你并没有用任何命令指定过这个属性呀！好吧, 当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。 </p>
<p>当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支（比如 o/master）。然后再创建一个跟踪远程仓库中活动分支的本地分支，默认情况下这个本地分支会被命名为 master。 </p>
<p>克隆完成后，你会得到一个本地分支（如果没有这个本地分支的话，你的目录就是“空白”的），但是可以查看远程仓库中所有的分支（如果你好奇心很强的话）。这样做对于本地仓库和远程仓库来说，都是最佳选择。 </p>
<p>这也解释了为什么会在克隆的时候会看到下面的输出： </p>
</li>
</ul>
<figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">local branch &quot;master&quot; set to track remote branch &quot;o/master&quot;</span><br></pre></td></tr></table></figure>

<p> 我能自己指定这个属性吗？ </p>
<p> 当然可以啦！你可以让任意分支跟踪 o/master, 然后该分支会像 master 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 totallyNotMaster 上执行 git push，将工作推送到远程仓库的 master 分支上。 </p>
<p> 有两种方法设置这个属性</p>
<h3 id="17-1-第一种方法"><a href="#17-1-第一种方法" class="headerlink" title="17.1 第一种方法"></a>17.1 第一种方法</h3><p>通过远程分支检出一个新的分支，执行: </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b totallyNotMaster o/master</span><br></pre></td></tr></table></figure>

<p>  就可以创建一个名为  totallyNotMaster  的分支，它跟踪远程分支  o/master 。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224055.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224112.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224123.png" alt="img"> </p>
<h3 id="17-2-第二种方法"><a href="#17-2-第二种方法" class="headerlink" title="17.2 第二种方法"></a>17.2 第二种方法</h3><p> 另一种设置远程追踪分支的方法就是使用：git branch -u 命令，执行： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -u o/master foo</span><br></pre></td></tr></table></figure>

<p> 这样 foo 就会跟踪 o/master 了。如果当前就在 foo 分支上, 还可以省略 foo： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -u o/master</span><br></pre></td></tr></table></figure>



<h2 id="18-Git-Push-的参数"><a href="#18-Git-Push-的参数" class="headerlink" title="18.Git Push 的参数"></a>18.Git Push 的参数</h2><p> 我们可以为 push 指定参数，语法是： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push &lt;remote&gt; &lt;place&gt;</span><br></pre></td></tr></table></figure>

<p> <place> 参数是什么意思呢？我们稍后会深入其中的细节, 先看看例子, 这个命令是: </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin master</span><br></pre></td></tr></table></figure>

<p> 把这个命令翻译过来就是： </p>
<p> 切到本<strong>地仓库中的“master”分支，获取所有的提交</strong>，<strong>再到远程仓库“origin”中找到“master”分支</strong>，将远程仓库中没有的提交记录都添加上去，搞定之后告诉我。 </p>
<p> 【注意】 </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin side</span><br></pre></td></tr></table></figure>

<p> 把这个命令翻译过来就是： </p>
<p> 切到本<strong>地仓库中的“side”分支，获取所有的提交</strong>，<strong>再到远程仓库“origin”中找到“side”分支</strong>，将远程仓库中没有的提交记录都添加上去，搞定之后告诉我。 </p>
<p>  我们通过“place”参数来告诉 Git 提交记录来自于 master, 要推送到远程仓库中的 master。它实际就是要同步的两个仓库的位置。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224148.png" alt="img"></p>
<p>可以看到，即使HEAD指针挪动了位置，但丝毫不会影响我们的push操作~~</p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224203.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224219.png" alt="img"></p>
<p>要同时为源和目的地指定 <place> 的话，只需要用冒号 : 将二者连起来就可以了：</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin &lt;<span class="built_in">source</span>&gt;:&lt;destination&gt;</span><br></pre></td></tr></table></figure>

<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224235.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224244.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224252.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224306.png" alt="img"></p>
<p>【<strong>不存在的分支，git会帮你新建，基于谁新建呢？本地的o/master，远程的master</strong>】</p>
<h2 id="19-Git-fetch-的参数"><a href="#19-Git-fetch-的参数" class="headerlink" title="19.Git fetch 的参数"></a>19.Git fetch 的参数</h2><p><place> 参数 </p>
<p> 如果你像如下命令这样为 git fetch 设置 的话： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin foo</span><br></pre></td></tr></table></figure>

<p>  Git 会到远程仓库的  foo  分支上，然后获取所有本地不存在的提交，放到本地的  o/foo  上。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224318.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224346.png" alt="img"> </p>
<p> “如果我们指定 <source>:<destination> 会发生什么呢？” </p>
<p> 如果你觉得直接更新本地分支很爽，那你就用冒号分隔的 refspec 吧。不过，你不能在当前检出的分支上干这个事，但是其它分支是可以的。 </p>
<p> 这里有一点是需要注意的 —— <strong>source 现在指的是远程仓库中的位置，而 <destination> 才是要放置提交的本地仓库的位置。</strong>它与 git push 刚好相反，这是可以讲的通的，因为我们在往相反的方向传送数据。 </p>
<p>  理论上虽然行的通，但开发人员很少这么做。我在这里介绍它主要是为了从概念上说明  fetch  和  push  的相似性，只是方向相反罢了。</p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224401.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224409.png" alt="img"></p>
<h2 id="20-古怪的"><a href="#20-古怪的" class="headerlink" title="20.古怪的 "></a>20.古怪的 <source></h2><p> Git 有两种关于 <source> 的用法是比较诡异的，即你可以在 git push 或 git fetch 时不指定任何 source，方法就是仅保留冒号和 destination 部分，<strong>source 部分留空</strong>。 </p>
<ul>
<li><pre><code class="sh">git push origin :side 
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- &#96;&#96;&#96;sh</span><br><span class="line">  git fetch origin :bugFix</span><br></pre></td></tr></table></figure>

![img](https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224421.png)
</code></pre>
</li>
</ul>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224441.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224448.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224455.png" alt="img"></p>
<h2 id="21-Git-pull-参数"><a href="#21-Git-pull-参数" class="headerlink" title="21.Git pull 参数"></a>21.Git pull 参数</h2><p> 既然你已经掌握关于 git fetch 和 git push 参数的方方面面了，关于 git pull 几乎没有什么可以讲的了 :) </p>
<p> 因为 git pull 到头来就是 fetch 后跟 merge 的缩写。你可以理解为用同样的参数执行 git fetch，然后再 merge 你所抓取到的提交记录。 </p>
<p> 还可以和其它更复杂的参数一起使用。 </p>
<p> 以下命令在Git中是等效的： </p>
<p> git pull origin foo 相当于： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin foo; git merge o/foo</span><br></pre></td></tr></table></figure>

<p> 还有… </p>
<p> git pull origin bar~1:bugFix 相当于： </p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin bar~1:bugFix; git merge bugFix</span><br></pre></td></tr></table></figure>

<p>  看到了吗？git pull首先就是fetch + merge的缩写，git pull唯一关注的是提交最终合并到哪里（也就是为git fetch所提供的目的地参数） </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224509.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224521.png" alt="img"></p>
<p><strong>检出位置即HEAD指针</strong></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224602.png" alt="img"></p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224532.png" alt="img"></p>
<h2 id="22-git-本地修改被reset后怎么恢复？"><a href="#22-git-本地修改被reset后怎么恢复？" class="headerlink" title="22.git 本地修改被reset后怎么恢复？"></a>22.git 本地修改被reset后怎么恢复？</h2><p> 可以使用git reflog 命令查看本地的操作记录 b7057a9 HEAD@{0}: reset: moving to b7057a9 98abc5a HEAD@{1}: commit: more stuff added to foo b7057a9 HEAD@{2}: commit (initial): initial commit 然后使用$ git reset –hard 98abc5a回到98abc5a对应的那次commit </p>
<p> 【拓展】 </p>
<p> reset命令有3种方式： 1：git reset –-mixed：此为默认方式，不带任何参数的git reset，即时这种方式，它回退到某个版本，<strong>只保留<a href="">源码</a>**，回退commit和index信息 2：git reset –-soft：回退到某个版本，</strong>只回退了commit的信息，不会恢复到index一级。如果还要提交，直接commit即可** 3：git reset –-hard：彻底回退到某个版本，本地的<a href="">源码</a>也会变为上一个版本的内容 这就是**–soft** 和 <strong>–hard</strong> 的区别：**–hard** 会清空工作目录和暂存区的改动,而 <strong>–soft**</strong>则会保留工作目录的内容，并把因为保留工作目录内容所带来的新的文件差异放进暂存区(index)**。</p>
<h2 id="23-reflog"><a href="#23-reflog" class="headerlink" title="23.reflog"></a>23.reflog</h2><p> 每个人都会犯错误，这完全没有关系！有时候你可能觉得自己把仓库搞得一团糟，只想把它删了完事。 </p>
<p>  git reflog 是个非常有用的命令，可以显示所有操作的日志。包括 merge ， reset ， revert  等，基本上包括了对分支的任何更改。 </p>
<p>  <img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224748.gif" alt="img"></p>
<p> 如果出错了，你可以根据reflog提供的信息通过重置HEAD 来撤销改动。 </p>
<p>  比如，我们实际上并不想合并分支。当我们执行  git reflog 命令时，我们看到在合并前仓库位于  HEAD@{1} 。我们执行下 git reset 命令，让 HEAD 重新指回原来的 HEAD@{1} 位置。</p>
<p><img data-src="https://cdn.jsdelivr.net/gh/huxingyi1997/my_img/img/20210420224801.gif" alt="img"></p>
<p>我们可以看到，最新的操作也记录到reflog里了。</p>
<h2 id="24-其它实用命令"><a href="#24-其它实用命令" class="headerlink" title="24.其它实用命令"></a>24.其它实用命令</h2><p> ①git status 查看工作区、本地仓库、缓存（stash）的文件修改 状态 </p>
<p> ②git branch 查看当前版本（分支） </p>
<p> ③git branch -a 查看所有版本（分支） </p>
<p> ④git checkout filename 放弃某文件的修改。 </p>
<p> ⑤git stash 储存修改 </p>
<p> ⑥git stash pop 弹出储存文件，此时新文件可能会与你的文件产生冲突，解决冲突。 </p>
<p> ⑦git add filename 添加某个修改文件 </p>
<p> ⑧git add . 提交所有加点 </p>
<p> ⑨git branch -d <branch_name> 刪除 local branch </p>
<p> ①执行git commit –amend –no-edit之后，message内容并没有发生变化，并且最重要的是只有一条commit记录。如果要修改上一条的message，那么去掉–no-edit选项即可，git commit –amend -m “xxxx”。</p>

    </div>

    
    
    
      
<div>
        <div style="text-align:center;color: #ccc;font-size:14px;">-------------本文结束<i class="fa fa-paw"></i>感谢您的阅读-------------</div>
</div>
        

  <div class="followme">
    <p>欢迎关注我的其它发布渠道</p>

    <div class="social-list">

        <div class="social-item">
          <a target="_blank" class="social-link" href="/atom.xml">
            <span class="icon">
              <i class="fa fa-rss"></i>
            </span>

            <span class="label">RSS</span>
          </a>
        </div>
    </div>
  </div>


      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/git/" rel="tag"><i class="fa fa-tag"></i> git</a>
              <a href="/tags/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" rel="tag"><i class="fa fa-tag"></i> 常用命令</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/2021/04/03/JavaScript%E6%89%8B%E5%86%99%E6%95%B0%E7%BB%84%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0/" rel="prev" title="JavaScript手写数组常用函数">
      <i class="fa fa-chevron-left"></i> JavaScript手写数组常用函数
    </a></div>
      <div class="post-nav-item">
    <a href="/2021/04/04/JavaScript%E6%89%8B%E5%86%99ES5%E7%BB%A7%E6%89%BF/" rel="next" title="JavaScript手写ES5继承">
      JavaScript手写ES5继承 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          
    <div class="comments" id="valine-comments"></div>

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#Git-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4"><span class="nav-text">Git 常用命令</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E6%96%B0%E5%BB%BA%E4%BB%A3%E7%A0%81%E5%BA%93"><span class="nav-text">1.新建代码库</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%9C%A8%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AAGit%E4%BB%A3%E7%A0%81%E5%BA%93"><span class="nav-text">在当前目录新建一个Git代码库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%EF%BC%8C%E5%B0%86%E5%85%B6%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%BAGit%E4%BB%A3%E7%A0%81%E5%BA%93"><span class="nav-text">新建一个目录，将其初始化为Git代码库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%8B%E8%BD%BD%E4%B8%80%E4%B8%AA%E9%A1%B9%E7%9B%AE%E5%92%8C%E5%AE%83%E7%9A%84%E6%95%B4%E4%B8%AA%E4%BB%A3%E7%A0%81%E5%8E%86%E5%8F%B2"><span class="nav-text">下载一个项目和它的整个代码历史</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E9%85%8D%E7%BD%AE%E6%93%8D%E4%BD%9C"><span class="nav-text">2.配置操作</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE"><span class="nav-text">全局配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BD%93%E5%89%8D%E4%BB%93%E5%BA%93%E9%85%8D%E7%BD%AE"><span class="nav-text">当前仓库配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B-global-%E9%85%8D%E7%BD%AE"><span class="nav-text">查看 global 配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E5%BD%93%E5%89%8D%E4%BB%93%E5%BA%93%E9%85%8D%E7%BD%AE"><span class="nav-text">查看当前仓库配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4-global-%E9%85%8D%E7%BD%AE"><span class="nav-text">删除 global 配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E5%BD%93%E5%89%8D%E4%BB%93%E5%BA%93%E9%85%8D%E7%BD%AE"><span class="nav-text">删除当前仓库配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BC%96%E8%BE%91Git%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"><span class="nav-text">编辑Git配置文件</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E6%9C%AC%E5%9C%B0%E6%93%8D%E4%BD%9C"><span class="nav-text">3.本地操作</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E5%8F%98%E6%9B%B4%E6%83%85%E5%86%B5"><span class="nav-text">查看变更情况</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E5%8F%8A%E5%85%B6%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%89%80%E6%9C%89%E5%8F%98%E6%9B%B4%E9%83%BD%E5%8A%A0%E5%85%A5%E5%88%B0%E6%9A%82%E5%AD%98%E5%8C%BA"><span class="nav-text">将当前目录及其子目录下所有变更都加入到暂存区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E4%BB%93%E5%BA%93%E5%86%85%E6%89%80%E6%9C%89%E5%8F%98%E6%9B%B4%E9%83%BD%E5%8A%A0%E5%85%A5%E5%88%B0%E6%9A%82%E5%AD%98%E5%8C%BA"><span class="nav-text">将仓库内所有变更都加入到暂存区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E6%B7%BB%E5%8A%A0%E5%88%B0%E6%9A%82%E5%AD%98%E5%8C%BA"><span class="nav-text">将指定文件添加到暂存区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%B7%BB%E5%8A%A0%E6%AF%8F%E4%B8%AA%E5%8F%98%E5%8C%96%E5%89%8D%EF%BC%8C%E9%83%BD%E4%BC%9A%E8%A6%81%E6%B1%82%E7%A1%AE%E8%AE%A4"><span class="nav-text">添加每个变化前，都会要求确认</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E5%B7%A5%E4%BD%9C%E5%8C%BA%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%B0%86%E8%BF%99%E6%AC%A1%E5%88%A0%E9%99%A4%E6%94%BE%E5%85%A5%E6%9A%82%E5%AD%98%E5%8C%BA"><span class="nav-text">删除工作区文件，并且将这次删除放入暂存区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%81%9C%E6%AD%A2%E8%BF%BD%E8%B8%AA%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%86%E8%AF%A5%E6%96%87%E4%BB%B6%E4%BC%9A%E4%BF%9D%E7%95%99%E5%9C%A8%E5%B7%A5%E4%BD%9C%E5%8C%BA"><span class="nav-text">停止追踪指定文件，但该文件会保留在工作区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%94%B9%E5%90%8D%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%B0%86%E8%BF%99%E4%B8%AA%E6%94%B9%E5%90%8D%E6%94%BE%E5%85%A5%E6%9A%82%E5%AD%98%E5%8C%BA"><span class="nav-text">改名文件，并且将这个改名放入暂存区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AF%94%E8%BE%83%E5%B7%A5%E4%BD%9C%E5%8C%BA%E5%92%8C%E6%9A%82%E5%AD%98%E5%8C%BA%E7%9A%84%E6%89%80%E6%9C%89%E5%B7%AE%E5%BC%82"><span class="nav-text">比较工作区和暂存区的所有差异</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AF%94%E8%BE%83%E6%9F%90%E6%96%87%E4%BB%B6%E5%B7%A5%E4%BD%9C%E5%8C%BA%E5%92%8C%E6%9A%82%E5%AD%98%E5%8C%BA%E7%9A%84%E5%B7%AE%E5%BC%82"><span class="nav-text">比较某文件工作区和暂存区的差异</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AF%94%E8%BE%83%E6%9A%82%E5%AD%98%E5%8C%BA%E5%92%8C-HEAD-%E7%9A%84%E6%89%80%E6%9C%89%E5%B7%AE%E5%BC%82"><span class="nav-text">比较暂存区和 HEAD 的所有差异</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AF%94%E8%BE%83%E6%9F%90%E6%96%87%E4%BB%B6%E6%9A%82%E5%AD%98%E5%8C%BA%E5%92%8C-HEAD-%E7%9A%84%E5%B7%AE%E5%BC%82"><span class="nav-text">比较某文件暂存区和 HEAD 的差异</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AF%94%E8%BE%83%E6%9F%90%E6%96%87%E4%BB%B6%E5%B7%A5%E4%BD%9C%E5%8C%BA%E5%92%8C-HEAD-%E7%9A%84%E5%B7%AE%E5%BC%82"><span class="nav-text">比较某文件工作区和 HEAD 的差异</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%9B%E5%BB%BA-commit-%E6%8F%90%E4%BA%A4%E6%9A%82%E5%AD%98%E5%8C%BA%E5%88%B0%E4%BB%93%E5%BA%93%E5%8C%BA"><span class="nav-text">创建 commit 提交暂存区到仓库区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8F%90%E4%BA%A4%E5%B9%B6%E5%91%BD%E5%90%8D"><span class="nav-text">提交并命名</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8F%90%E4%BA%A4%E6%9A%82%E5%AD%98%E5%8C%BA%E7%9A%84%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E5%88%B0%E4%BB%93%E5%BA%93%E5%8C%BA"><span class="nav-text">提交暂存区的指定文件到仓库区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8F%90%E4%BA%A4%E5%B7%A5%E4%BD%9C%E5%8C%BA%E8%87%AA%E4%B8%8A%E6%AC%A1commit%E4%B9%8B%E5%90%8E%E7%9A%84%E5%8F%98%E5%8C%96%EF%BC%8C%E7%9B%B4%E6%8E%A5%E5%88%B0%E4%BB%93%E5%BA%93%E5%8C%BA"><span class="nav-text">提交工作区自上次commit之后的变化，直接到仓库区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8F%90%E4%BA%A4%E6%97%B6%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89diff%E4%BF%A1%E6%81%AF"><span class="nav-text">提交时显示所有diff信息</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E5%B7%A5%E4%BD%9C%E5%8C%BA%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E6%81%A2%E5%A4%8D%E6%88%90%E5%92%8C%E6%9A%82%E5%AD%98%E5%8C%BA%E4%B8%80%E8%87%B4"><span class="nav-text">将工作区指定文件恢复成和暂存区一致</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E6%9A%82%E5%AD%98%E5%8C%BA%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E6%81%A2%E5%A4%8D%E6%88%90%E5%92%8C-HEAD-%E4%B8%80%E8%87%B4"><span class="nav-text">将暂存区指定文件恢复成和 HEAD 一致</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E6%9A%82%E5%AD%98%E5%8C%BA%E5%92%8C%E5%B7%A5%E4%BD%9C%E5%8C%BA%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E6%81%A2%E5%A4%8D%E6%88%90%E5%92%8C-HEAD-%E4%B8%80%E6%A0%B7"><span class="nav-text">将暂存区和工作区所有文件恢复成和 HEAD 一样</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%94%A8-difftool-%E6%AF%94%E8%BE%83%E4%BB%BB%E6%84%8F%E4%B8%A4%E4%B8%AA-commit-%E7%9A%84%E5%B7%AE%E5%BC%82"><span class="nav-text">用 difftool 比较任意两个 commit 的差异</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E5%93%AA%E4%BA%9B%E6%96%87%E4%BB%B6%E6%B2%A1%E8%A2%AB-Git-%E7%AE%A1%E6%8E%A7"><span class="nav-text">查看哪些文件没被 Git 管控</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E6%9C%AA%E5%A4%84%E7%90%86%E5%AE%8C%E7%9A%84%E5%8F%98%E6%9B%B4%E5%85%88%E4%BF%9D%E5%AD%98%E5%88%B0-stash-%E4%B8%AD"><span class="nav-text">将未处理完的变更先保存到 stash 中</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%B4%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%A4%84%E7%90%86%E5%AE%8C%E5%90%8E%E7%BB%A7%E7%BB%AD%E4%B9%8B%E5%89%8D%E7%9A%84%E5%B7%A5%E4%BD%9C"><span class="nav-text">临时任务处理完后继续之前的工作</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E6%89%80%E6%9C%89-stash"><span class="nav-text">查看所有 stash</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%8F%96%E5%9B%9E%E6%9F%90%E6%AC%A1-stash-%E7%9A%84%E5%8F%98%E6%9B%B4"><span class="nav-text">取回某次 stash 的变更</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%BC%98%E9%9B%85%E4%BF%AE%E6%94%B9%E6%9C%80%E5%90%8E%E4%B8%80%E6%AC%A1-commit"><span class="nav-text">优雅修改最后一次 commit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%BD%BF%E7%94%A8%E4%B8%80%E6%AC%A1%E6%96%B0%E7%9A%84commit%EF%BC%8C%E6%9B%BF%E4%BB%A3%E4%B8%8A%E4%B8%80%E6%AC%A1%E6%8F%90%E4%BA%A4"><span class="nav-text">使用一次新的commit，替代上一次提交</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E5%81%9A%E4%B8%8A%E4%B8%80%E6%AC%A1commit%EF%BC%8C%E5%B9%B6%E5%8C%85%E6%8B%AC%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B0%E5%8F%98%E5%8C%96"><span class="nav-text">重做上一次commit，并包括指定文件的新变化</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-%E5%88%86%E6%94%AF%E6%93%8D%E4%BD%9C"><span class="nav-text">4.分支操作</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF"><span class="nav-text">列出所有本地分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E5%BD%93%E5%89%8D%E5%B7%A5%E4%BD%9C%E5%88%86%E6%94%AF%E5%8F%8A%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF"><span class="nav-text">查看当前工作分支及本地分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF%E5%92%8C%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF"><span class="nav-text">列出所有本地分支和远程分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E6%9C%AC%E5%9C%B0%E5%92%8C%E8%BF%9C%E7%AB%AF%E5%88%86%E6%94%AF"><span class="nav-text">查看本地和远端分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E8%BF%9C%E7%AB%AF%E5%88%86%E6%94%AF"><span class="nav-text">查看远端分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%87%E6%8D%A2%E5%88%B0%E6%8C%87%E5%AE%9A%E5%88%86%E6%94%AF"><span class="nav-text">切换到指定分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%9F%BA%E4%BA%8E%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E5%88%9B%E5%BB%BA%E6%96%B0%E5%88%86%E6%94%AF%EF%BC%8C%E4%BD%86%E4%BE%9D%E7%84%B6%E5%81%9C%E7%95%99%E5%9C%A8%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF"><span class="nav-text">基于当前分支创建新分支，但依然停留在当前分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%9F%BA%E4%BA%8E%E6%8C%87%E5%AE%9A%E5%88%86%E6%94%AF%E5%88%9B%E5%BB%BA%E6%96%B0%E5%88%86%E6%94%AF"><span class="nav-text">基于指定分支创建新分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%9F%BA%E4%BA%8E%E6%9F%90%E4%B8%AA-commit-%E5%88%9B%E5%BB%BA%E5%88%86%E6%94%AF"><span class="nav-text">基于某个 commit 创建分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%88%86%E6%94%AF%EF%BC%8C%E4%B8%8E%E6%8C%87%E5%AE%9A%E7%9A%84%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF%E5%BB%BA%E7%AB%8B%E8%BF%BD%E8%B8%AA%E5%85%B3%E7%B3%BB"><span class="nav-text">新建一个分支，与指定的远程分支建立追踪关系</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BB%BA%E7%AB%8B%E8%BF%BD%E8%B8%AA%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E7%8E%B0%E6%9C%89%E5%88%86%E6%94%AF%E4%B8%8E%E6%8C%87%E5%AE%9A%E7%9A%84%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF%E4%B9%8B%E9%97%B4"><span class="nav-text">建立追踪关系，在现有分支与指定的远程分支之间</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%9B%E5%BB%BA%E5%B9%B6%E5%88%87%E6%8D%A2%E5%88%B0%E8%AF%A5%E5%88%86%E6%94%AF"><span class="nav-text">创建并切换到该分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%87%E6%8D%A2%E5%88%B0%E6%8C%87%E5%AE%9A%E5%88%86%E6%94%AF%EF%BC%8C%E5%B9%B6%E6%9B%B4%E6%96%B0%E5%B7%A5%E4%BD%9C%E5%8C%BA"><span class="nav-text">切换到指定分支，并更新工作区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%87%E6%8D%A2%E5%88%B0%E4%B8%8A%E4%B8%80%E4%B8%AA%E5%88%86%E6%94%AF"><span class="nav-text">切换到上一个分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF"><span class="nav-text">列出所有远程分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%AE%89%E5%85%A8%E5%88%A0%E9%99%A4%E6%9C%AC%E5%9C%B0%E6%9F%90%E5%88%86%E6%94%AF"><span class="nav-text">安全删除本地某分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BC%BA%E8%A1%8C%E5%88%A0%E9%99%A4%E6%9C%AC%E5%9C%B0%E6%9F%90%E5%88%86%E6%94%AF"><span class="nav-text">强行删除本地某分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E5%B7%B2%E5%90%88%E5%B9%B6%E5%88%B0-master-%E5%88%86%E6%94%AF%E7%9A%84%E6%89%80%E6%9C%89%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF"><span class="nav-text">删除已合并到 master 分支的所有本地分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E8%BF%9C%E7%AB%AF-origin-%E5%B7%B2%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E6%89%80%E6%9C%89%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF"><span class="nav-text">删除远端 origin 已不存在的所有本地分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF"><span class="nav-text">删除远程分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86-A-%E5%88%86%E6%94%AF%E5%90%88%E5%85%A5%E5%88%B0%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E4%B8%AD%E4%B8%94%E4%B8%BA-merge-%E5%88%9B%E5%BB%BA-commit"><span class="nav-text">将 A 分支合入到当前分支中且为 merge 创建 commit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86-A-%E5%88%86%E6%94%AF%E5%90%88%E5%85%A5%E5%88%B0-B-%E5%88%86%E6%94%AF%E4%B8%AD%E4%B8%94%E4%B8%BA-merge-%E5%88%9B%E5%BB%BA-commit"><span class="nav-text">将 A 分支合入到 B 分支中且为 merge 创建 commit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E5%9F%BA%E4%BA%8E-B-%E5%88%86%E6%94%AF%E5%81%9A-rebase%EF%BC%8C%E4%BB%A5%E4%BE%BF%E5%B0%86B%E5%88%86%E6%94%AF%E5%90%88%E5%85%A5%E5%88%B0%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF"><span class="nav-text">将当前分支基于 B 分支做 rebase，以便将B分支合入到当前分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86-A-%E5%88%86%E6%94%AF%E5%9F%BA%E4%BA%8E-B-%E5%88%86%E6%94%AF%E5%81%9A-rebase%EF%BC%8C%E4%BB%A5%E4%BE%BF%E5%B0%86-B-%E5%88%86%E6%94%AF%E5%90%88%E5%85%A5%E5%88%B0-A-%E5%88%86%E6%94%AF"><span class="nav-text">将 A 分支基于 B 分支做 rebase，以便将 B 分支合入到 A 分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AAcommit%EF%BC%8C%E5%90%88%E5%B9%B6%E8%BF%9B%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF"><span class="nav-text">选择一个commit，合并进当前分支</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#5-%E5%8F%98%E6%9B%B4%E5%8E%86%E5%8F%B2"><span class="nav-text">5.变更历史</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%98%BE%E7%A4%BA%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E7%9A%84%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2"><span class="nav-text">显示当前分支的版本历史</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E5%90%84%E4%B8%AA-commit-%E7%94%A8%E4%B8%80%E8%A1%8C%E6%98%BE%E7%A4%BA"><span class="nav-text">当前分支各个 commit 用一行显示</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%98%BE%E7%A4%BA%E5%B0%B1%E8%BF%91%E7%9A%84-n-%E4%B8%AA-commit"><span class="nav-text">显示就近的 n 个 commit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%98%BE%E7%A4%BAcommit%E5%8E%86%E5%8F%B2%EF%BC%8C%E4%BB%A5%E5%8F%8A%E6%AF%8F%E6%AC%A1commit%E5%8F%91%E7%94%9F%E5%8F%98%E6%9B%B4%E7%9A%84%E6%96%87%E4%BB%B6"><span class="nav-text">显示commit历史，以及每次commit发生变更的文件</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%94%A8%E5%9B%BE%E7%A4%BA%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89%E5%88%86%E6%94%AF%E7%9A%84%E5%8E%86%E5%8F%B2"><span class="nav-text">用图示显示所有分支的历史</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%90%9C%E7%B4%A2%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2%EF%BC%8C%E6%A0%B9%E6%8D%AE%E5%85%B3%E9%94%AE%E8%AF%8D"><span class="nav-text">搜索提交历史，根据关键词</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E6%B6%89%E5%8F%8A%E5%88%B0%E6%9F%90%E6%96%87%E4%BB%B6%E5%8F%98%E6%9B%B4%E7%9A%84%E6%89%80%E6%9C%89-commit"><span class="nav-text">查看涉及到某文件变更的所有 commit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%90%E6%96%87%E4%BB%B6%E5%90%84%E8%A1%8C%E6%9C%80%E5%90%8E%E4%BF%AE%E6%94%B9%E5%AF%B9%E5%BA%94%E7%9A%84-commit-%E4%BB%A5%E5%8F%8A%E4%BD%9C%E8%80%85"><span class="nav-text">某文件各行最后修改对应的 commit 以及作者</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#6-%E6%A0%87%E7%AD%BE%E6%93%8D%E4%BD%9C"><span class="nav-text">6.标签操作</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E5%B7%B2%E6%9C%89%E6%A0%87%E7%AD%BE"><span class="nav-text">查看已有标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%96%B0%E5%BB%BA%E6%A0%87%E7%AD%BE"><span class="nav-text">新建标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%96%B0%E5%BB%BA%E5%B8%A6%E5%A4%87%E6%B3%A8%E6%A0%87%E7%AD%BE"><span class="nav-text">新建带备注标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BB%99%E6%8C%87%E5%AE%9A%E7%9A%84-commit-%E6%89%93%E6%A0%87%E7%AD%BE"><span class="nav-text">给指定的 commit 打标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8E%A8%E9%80%81%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E6%A0%87%E7%AD%BE"><span class="nav-text">推送一个本地标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8E%A8%E9%80%81%E5%85%A8%E9%83%A8%E6%9C%AA%E6%8E%A8%E9%80%81%E8%BF%87%E7%9A%84%E6%9C%AC%E5%9C%B0%E6%A0%87%E7%AD%BE"><span class="nav-text">推送全部未推送过的本地标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E6%A0%87%E7%AD%BE"><span class="nav-text">删除一个本地标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E4%B8%80%E4%B8%AA%E8%BF%9C%E7%AB%AF%E6%A0%87%E7%AD%BE"><span class="nav-text">删除一个远端标签</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%88%86%E6%94%AF%EF%BC%8C%E6%8C%87%E5%90%91%E6%9F%90%E4%B8%AAtag"><span class="nav-text">新建一个分支，指向某个tag</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#7-%E8%BF%9C%E7%AB%AF%E4%BA%A4%E4%BA%92"><span class="nav-text">7.远端交互</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9F%A5%E7%9C%8B%E6%89%80%E6%9C%89%E8%BF%9C%E7%AB%AF%E4%BB%93%E5%BA%93"><span class="nav-text">查看所有远端仓库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%B7%BB%E5%8A%A0%E8%BF%9C%E7%AB%AF%E4%BB%93%E5%BA%93%EF%BC%8C%E5%B9%B6%E5%91%BD%E5%90%8D"><span class="nav-text">添加远端仓库，并命名</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E8%BF%9C%E7%AB%AF%E4%BB%93%E5%BA%93"><span class="nav-text">删除远端仓库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E5%91%BD%E5%90%8D%E8%BF%9C%E7%AB%AF%E4%BB%93%E5%BA%93"><span class="nav-text">重命名远端仓库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E8%BF%9C%E7%AB%AF%E6%89%80%E6%9C%89%E5%88%86%E6%94%AF%E5%92%8C%E6%A0%87%E7%AD%BE%E7%9A%84%E5%8F%98%E6%9B%B4%E9%83%BD%E6%8B%89%E5%88%B0%E6%9C%AC%E5%9C%B0"><span class="nav-text">将远端所有分支和标签的变更都拉到本地</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8A%8A%E8%BF%9C%E7%AB%AF%E5%88%86%E6%94%AF%E7%9A%84%E5%8F%98%E6%9B%B4%E6%8B%89%E5%88%B0%E6%9C%AC%E5%9C%B0%EF%BC%8C%E4%B8%94-merge-%E5%88%B0%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF"><span class="nav-text">把远端分支的变更拉到本地，且 merge 到本地分支</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%8B%E8%BD%BD%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E6%89%80%E6%9C%89%E5%8F%98%E5%8A%A8"><span class="nav-text">下载远程仓库的所有变动</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B0%86%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF-push-%E5%88%B0%E8%BF%9C%E7%AB%AF"><span class="nav-text">将本地分支 push 到远端</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BC%BA%E8%A1%8C%E6%8E%A8%E9%80%81%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E5%88%B0%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%EF%BC%8C%E5%8D%B3%E4%BD%BF%E6%9C%89%E5%86%B2%E7%AA%81"><span class="nav-text">强行推送当前分支到远程仓库，即使有冲突</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8E%A8%E9%80%81%E6%89%80%E6%9C%89%E5%88%86%E6%94%AF%E5%88%B0%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93"><span class="nav-text">推送所有分支到远程仓库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%A0%E9%99%A4%E8%BF%9C%E7%AB%AF%E5%88%86%E6%94%AF"><span class="nav-text">删除远端分支</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#8-%E6%92%A4%E9%94%80"><span class="nav-text">8.撤销</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%81%A2%E5%A4%8D%E6%9A%82%E5%AD%98%E5%8C%BA%E7%9A%84%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E5%88%B0%E5%B7%A5%E4%BD%9C%E5%8C%BA"><span class="nav-text">恢复暂存区的指定文件到工作区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%81%A2%E5%A4%8D%E6%9F%90%E4%B8%AAcommit%E7%9A%84%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E5%88%B0%E6%9A%82%E5%AD%98%E5%8C%BA%E5%92%8C%E5%B7%A5%E4%BD%9C%E5%8C%BA"><span class="nav-text">恢复某个commit的指定文件到暂存区和工作区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%81%A2%E5%A4%8D%E6%9A%82%E5%AD%98%E5%8C%BA%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%88%B0%E5%B7%A5%E4%BD%9C%E5%8C%BA"><span class="nav-text">恢复暂存区的所有文件到工作区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E7%BD%AE%E6%9A%82%E5%AD%98%E5%8C%BA%E7%9A%84%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%EF%BC%8C%E4%B8%8E%E4%B8%8A%E4%B8%80%E6%AC%A1commit%E4%BF%9D%E6%8C%81%E4%B8%80%E8%87%B4%EF%BC%8C%E4%BD%86%E5%B7%A5%E4%BD%9C%E5%8C%BA%E4%B8%8D%E5%8F%98"><span class="nav-text">重置暂存区的指定文件，与上一次commit保持一致，但工作区不变</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E7%BD%AE%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E7%9A%84%E6%8C%87%E9%92%88%E4%B8%BA%E6%8C%87%E5%AE%9Acommit%EF%BC%8C%E5%90%8C%E6%97%B6%E9%87%8D%E7%BD%AE%E6%9A%82%E5%AD%98%E5%8C%BA%EF%BC%8C%E4%BD%86%E5%B7%A5%E4%BD%9C%E5%8C%BA%E4%B8%8D%E5%8F%98"><span class="nav-text">重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E7%BD%AE%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E7%9A%84%E6%8C%87%E9%92%88%E4%B8%BA%E6%8C%87%E5%AE%9Acommit%EF%BC%8C%E5%90%8C%E6%97%B6%E9%87%8D%E7%BD%AE%E6%9A%82%E5%AD%98%E5%8C%BA%EF%BC%8C%E4%BD%86%E5%B7%A5%E4%BD%9C%E5%8C%BA%E4%B8%8D%E5%8F%98-1"><span class="nav-text">重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E7%BD%AE%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF%E7%9A%84HEAD%E4%B8%BA%E6%8C%87%E5%AE%9Acommit%EF%BC%8C%E5%90%8C%E6%97%B6%E9%87%8D%E7%BD%AE%E6%9A%82%E5%AD%98%E5%8C%BA%E5%92%8C%E5%B7%A5%E4%BD%9C%E5%8C%BA%EF%BC%8C%E4%B8%8E%E6%8C%87%E5%AE%9Acommit%E4%B8%80%E8%87%B4"><span class="nav-text">重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%87%8D%E7%BD%AE%E5%BD%93%E5%89%8DHEAD%E4%B8%BA%E6%8C%87%E5%AE%9Acommit%EF%BC%8C%E4%BD%86%E4%BF%9D%E6%8C%81%E6%9A%82%E5%AD%98%E5%8C%BA%E5%92%8C%E5%B7%A5%E4%BD%9C%E5%8C%BA%E4%B8%8D%E5%8F%98"><span class="nav-text">重置当前HEAD为指定commit，但保持暂存区和工作区不变</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AAcommit%EF%BC%8C%E7%94%A8%E6%9D%A5%E6%92%A4%E9%94%80%E6%8C%87%E5%AE%9Acommit"><span class="nav-text">新建一个commit，用来撤销指定commit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%9A%82%E6%97%B6%E5%B0%86%E6%9C%AA%E6%8F%90%E4%BA%A4%E7%9A%84%E5%8F%98%E5%8C%96%E7%A7%BB%E9%99%A4%EF%BC%8C%E7%A8%8D%E5%90%8E%E5%86%8D%E7%A7%BB%E5%85%A5"><span class="nav-text">暂时将未提交的变化移除，稍后再移入</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%B0%8F%E7%BB%93"><span class="nav-text">小结</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E9%99%84%E5%BD%95%E4%B8%80%EF%BC%9AGit%E5%8F%98%E5%9F%BA%E5%90%88%E5%B9%B6"><span class="nav-text">附录一：Git变基合并</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E8%AF%B4%E6%98%8E"><span class="nav-text">1.说明</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#1-1-%E5%8F%98%E5%9F%BA%E8%A6%81%E9%81%B5%E5%AE%88%E7%9A%84%E5%87%86%E5%88%99"><span class="nav-text">1.1 变基要遵守的准则</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#1-2-%E5%8F%98%E5%9F%BA%E7%9A%84%E5%AE%9E%E8%B4%A8"><span class="nav-text">1.2 变基的实质</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E5%90%8E%E6%82%94%E8%8D%AF"><span class="nav-text">2.后悔药</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E5%BC%80%E5%8F%91%E6%9C%9F%E9%97%B4%E7%9A%84rebase%E6%93%8D%E4%BD%9C"><span class="nav-text">3.开发期间的rebase操作</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#3-1-%E8%83%8C%E6%99%AF"><span class="nav-text">3.1 背景</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3-2-%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4"><span class="nav-text">3.2 操作步骤</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3-3-git-cherry-pick"><span class="nav-text">3.3 git cherry-pick</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%9F%BA%E6%9C%AC%E5%BA%94%E7%94%A8"><span class="nav-text">基本应用</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E8%BD%AC%E7%A7%BB%E5%A4%9A%E4%B8%AA%E6%8F%90%E4%BA%A4"><span class="nav-text">转移多个提交</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E9%99%84%E5%BD%95%E4%BA%8C%EF%BC%9Agit%E5%B9%B2%E8%B4%A7%EF%BC%8C%E8%8A%B1%E6%95%B4%E6%95%B4%E4%B8%A4%E5%A4%A9%E5%90%90%E8%A1%80%E6%95%B4%E7%90%86"><span class="nav-text">附录二：git干货，花整整两天吐血整理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#0-%E7%B2%BE%E9%AB%93%E6%80%BB%E7%BB%93"><span class="nav-text">0.精髓总结</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#1-Git%E4%B8%AD%E7%9A%84%E2%80%98HEAD%E2%80%99%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F"><span class="nav-text">1.Git中的‘HEAD’是什么？</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#1-1-%E9%97%AE%E9%A2%98%E6%9D%A5%E6%BA%90"><span class="nav-text">1.1 问题来源</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#1-2-%E5%9B%9E%E7%AD%94"><span class="nav-text">1.2  回答</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E5%90%88%E5%B9%B6%E5%88%86%E6%94%AF%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95%EF%BC%9Agit-merge-amp-git-rebase"><span class="nav-text">2.合并分支的两种方法：git merge &amp; git rebase</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#2-1-git-merge"><span class="nav-text">2.1 git merge</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2-2-git-rebase"><span class="nav-text">2.2 git rebase</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E4%BB%80%E4%B9%88%E6%98%AFfast-forward-%E5%92%8Cno-fast-forward%EF%BC%9F"><span class="nav-text">3.什么是fast-forward 和no-fast-forward？</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#3-1-fast-forward-%E2%80%93ff"><span class="nav-text">3.1 fast-forward (–ff)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3-2-no-fast-foward-%E2%80%93no-ff"><span class="nav-text">3.2 no-fast-foward (–no-ff)</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-%E5%88%86%E7%A6%BBHEAD%E7%9A%84%E6%96%B9%E6%B3%95-git-checkout"><span class="nav-text">4.分离HEAD的方法: git checkout</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#5-%E7%9B%B8%E5%AF%B9%E5%BC%95%E7%94%A8"><span class="nav-text">5.相对引用</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#6-%E6%92%A4%E9%94%80%E6%8F%90%E4%BA%A4%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95%EF%BC%9Agit-reset-amp-git-revert"><span class="nav-text">6.撤销提交的两种方法：git reset &amp; git revert</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#7-%E6%95%B4%E7%90%86%E6%8F%90%E4%BA%A4%E8%AE%B0%E5%BD%95-git-cherry-pick-amp-git-rebase-i"><span class="nav-text">7.整理提交记录:git cherry-pick &amp; git rebase -i</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#7-1-%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E6%98%AF-git-cherry-pick"><span class="nav-text">7.1 第一个命令是 git cherry-pick</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#7-2-%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%91%BD%E4%BB%A4%E6%98%AF-%E4%BA%A4%E4%BA%92%E5%BC%8F%E7%9A%84rebase"><span class="nav-text">7.2 第二个命令是 交互式的rebase</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#8-%E6%B7%BB%E5%8A%A0%E9%94%9A%E7%82%B9%EF%BC%9Agit-tag"><span class="nav-text">8.添加锚点：git tag</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#9-%E6%8F%8F%E8%BF%B0%E7%A6%BB%E4%BD%A0%E6%9C%80%E8%BF%91%E7%9A%84%E9%94%9A%E7%82%B9%EF%BC%88%E4%B9%9F%E5%B0%B1%E6%98%AF%E6%A0%87%E7%AD%BE%EF%BC%89-git-describe"><span class="nav-text">9.描述离你最近的锚点（也就是标签）:git describe</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#10-%E6%8B%89%E5%8F%96%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%EF%BC%9Agit-clone"><span class="nav-text">10.拉取远程仓库：git clone</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#12-git-fetch"><span class="nav-text">12.git fetch</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#13-git-pull"><span class="nav-text">13.git pull</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#14-git-push"><span class="nav-text">14.git push</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#15-%E5%81%8F%E7%A6%BB%E7%9A%84%E5%8E%86%E5%8F%B2%E6%8F%90%E4%BA%A4"><span class="nav-text">15.偏离的历史提交</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#16-%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8B%92%E7%BB%9D-Remote-Rejected"><span class="nav-text">16.远程服务器拒绝!(Remote Rejected)</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#17-%E8%BF%9C%E7%A8%8B%E8%BF%BD%E8%B8%AA"><span class="nav-text">17.远程追踪</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#17-1-%E7%AC%AC%E4%B8%80%E7%A7%8D%E6%96%B9%E6%B3%95"><span class="nav-text">17.1 第一种方法</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#17-2-%E7%AC%AC%E4%BA%8C%E7%A7%8D%E6%96%B9%E6%B3%95"><span class="nav-text">17.2 第二种方法</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#18-Git-Push-%E7%9A%84%E5%8F%82%E6%95%B0"><span class="nav-text">18.Git Push 的参数</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#19-Git-fetch-%E7%9A%84%E5%8F%82%E6%95%B0"><span class="nav-text">19.Git fetch 的参数</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#20-%E5%8F%A4%E6%80%AA%E7%9A%84"><span class="nav-text">20.古怪的 </span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#21-Git-pull-%E5%8F%82%E6%95%B0"><span class="nav-text">21.Git pull 参数</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#22-git-%E6%9C%AC%E5%9C%B0%E4%BF%AE%E6%94%B9%E8%A2%ABreset%E5%90%8E%E6%80%8E%E4%B9%88%E6%81%A2%E5%A4%8D%EF%BC%9F"><span class="nav-text">22.git 本地修改被reset后怎么恢复？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#23-reflog"><span class="nav-text">23.reflog</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#24-%E5%85%B6%E5%AE%83%E5%AE%9E%E7%94%A8%E5%91%BD%E4%BB%A4"><span class="nav-text">24.其它实用命令</span></a></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="hxy"
      src="/images/Robben.gif">
  <p class="site-author-name" itemprop="name">hxy</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">80</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">8</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">120</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/huxingyi1997" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;huxingyi1997" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:huxingyi1997@zju.edu.cn" title="E-Mail → mailto:huxingyi1997@zju.edu.cn" rel="noopener" target="_blank"><i class="fa fa-envelope fa-fw"></i>E-Mail</a>
      </span>
  </div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2022</span>
  <span class="with-love">
    <i class="fa fa-frog"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">hxy</span>
</div>

<div class="theme-info">
  <div class="powered-by"></div>
  <span class="post-count">博客全站共1039.2k字</span>
</div>

        
<div class="busuanzi-count">
  <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
    <span class="post-meta-item" id="busuanzi_container_site_uv" style="display: none;">
      <span class="post-meta-item-icon">
        <i class="fa fa-user"></i>
      </span>
      <span class="site-uv" title="总访客量">
        <span id="busuanzi_value_site_uv"></span>
      </span>
    </span>
    <span class="post-meta-divider">|</span>
    <span class="post-meta-item" id="busuanzi_container_site_pv" style="display: none;">
      <span class="post-meta-item-icon">
        <i class="fa fa-eye"></i>
      </span>
      <span class="site-pv" title="总访问量">
        <span id="busuanzi_value_site_pv"></span>
      </span>
    </span>
</div>








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/lozad@1/dist/lozad.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  


<script>
NexT.utils.loadComments(document.querySelector('#valine-comments'), () => {
  NexT.utils.getScript('//unpkg.com/valine/dist/Valine.min.js', () => {
    var GUEST = ['nick', 'mail', 'link'];
    var guest = 'nick,mail,link';
    guest = guest.split(',').filter(item => {
      return GUEST.includes(item);
    });
    new Valine({
      el         : '#valine-comments',
      verify     : false,
      notify     : true,
      appId      : 'pQsO3ySbU4VtWN2j1FLA74Ha-gzGzoHsz',
      appKey     : 'QYacMDY2VY7Wazprg1X6FiUv',
      placeholder: "Just go go",
      avatar     : 'mm',
      meta       : guest,
      pageSize   : '10' || 10,
      visitor    : false,
      lang       : 'zh-cn' || 'zh-cn',
      path       : location.pathname,
      recordIP   : false,
      serverURLs : ''
    });
  }, window.Valine);
});
</script>

  
  <!-- 动态背景特效 -->
  <!-- 樱花特效 -->
    <script async src="/js/src/sakura.js"></script>
    <script async src="/js/src/fairyDustCursor.js"></script>
</body>
</html>
